Ejemplo n.º 1
0
void* Daemon::entry(void* data){
	struct sync* td = (struct sync*)data;
	Daemon* daemon = td->daemon;

	/* setup self-pipe */
	if ( pipe2(daemon->pipe, O_NONBLOCK) != 0 ){
		int saved = errno;
		Log::fatal("main", "pipe2() returned %d: %s\n", saved, strerror(saved));
		td->value = saved;
		sem_post(&td->semaphore);
		return NULL;
	}

	td->value = daemon->init();
	sem_post(&td->semaphore);

	if ( td->value != 0 ){
		return NULL;
	}

	if ( td->barrier ){
		pthread_barrier_wait(td->barrier);
	}

	daemon->run();
	daemon->cleanup();

	/* close pipe */
	close(daemon->pipe[0]);
	close(daemon->pipe[1]);

	/* free resources */
	sem_destroy(&td->semaphore);
	free(td);

	return 0;
}