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; }