diff --git a/opentracker.c b/opentracker.c index 2108a98..7c67f26 100644 --- a/opentracker.c +++ b/opentracker.c @@ -70,10 +70,6 @@ static void signal_handler( int s ) { #endif exit( 0 ); - } else if( s == SIGALRM ) { - /* Maintain our copy of the clock. time() on BSDs is very expensive. */ - g_now_seconds = time(NULL); - alarm(5); } } @@ -83,7 +79,6 @@ static void defaul_signal_handlers( void ) { sigaddset (&signal_mask, SIGPIPE); sigaddset (&signal_mask, SIGHUP); sigaddset (&signal_mask, SIGINT); - sigaddset (&signal_mask, SIGALRM); pthread_sigmask (SIG_BLOCK, &signal_mask, NULL); } @@ -95,11 +90,10 @@ static void install_signal_handlers( void ) { sa.sa_handler = signal_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; - if ((sigaction(SIGINT, &sa, NULL) == -1) || (sigaction(SIGALRM, &sa, NULL) == -1) ) + if ((sigaction(SIGINT, &sa, NULL) == -1)) panic( "install_signal_handlers" ); sigaddset (&signal_mask, SIGINT); - sigaddset (&signal_mask, SIGALRM); pthread_sigmask (SIG_UNBLOCK, &signal_mask, NULL); } @@ -608,12 +602,22 @@ int drop_privileges ( const char * const serveruser, const char * const serverdi return 0; } +/* Maintain our copy of the clock. time() on BSDs is very expensive. */ +static void *time_caching_worker(void*args) { + (void)args; + while (1) { + g_now_seconds = time(NULL); + sleep(5); + } +} + int main( int argc, char **argv ) { ot_ip6 serverip; ot_net tmpnet; int bound = 0, scanon = 1; uint16_t tmpport; char * statefile = 0; + pthread_t thread_id; /* time cacher */ memset( serverip, 0, sizeof(ot_ip6) ); #ifdef WANT_V4_ONLY @@ -690,6 +694,7 @@ int main( int argc, char **argv ) { panic( "drop_privileges failed, exiting. Last error"); g_now_seconds = time( NULL ); + pthread_create( &thread_id, NULL, time_caching_worker, NULL); /* Create our self pipe which allows us to interrupt mainloops io_wait in case some data is available to send out */ @@ -714,9 +719,6 @@ int main( int argc, char **argv ) { if( !g_udp_workers ) udp_init( -1, 0 ); - /* Kick off our initial clock setting alarm */ - alarm(5); - server_mainloop( 0 ); return 0;