X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=libmainloop%2Fsignal.c;h=f09d1db1a1b55c22037a981736c06cd1ca987cbb;hb=36e649d65b8bf06d1cd6fe84e3e250e3589480f0;hp=ddf6aba40cf582115bb133596c4b2b0aa39072de;hpb=8366314611bf30a0f31d25bf5f5023186fa87692;p=ion3.git diff --git a/libmainloop/signal.c b/libmainloop/signal.c index ddf6aba..f09d1db 100644 --- a/libmainloop/signal.c +++ b/libmainloop/signal.c @@ -1,12 +1,9 @@ /* * ion/libmainloop/signal.c * - * Copyright (c) Tuomo Valkonen 1999-2006. + * Copyright (c) Tuomo Valkonen 1999-2007. * - * Ion is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. + * See the included file LICENSE for details. */ #include @@ -45,6 +42,24 @@ WHook *mainloop_sigusr2_hook=NULL; static WTimer *queue=NULL; +int mainloop_gettime(struct timeval *val) +{ +#ifdef _POSIX_MONOTONIC_CLOCK + struct timespec spec; + int ret; + + ret=clock_gettime(CLOCK_MONOTONIC, &spec); + + val->tv_sec=spec.tv_sec; + val->tv_usec=spec.tv_nsec/1000; + + return ret; +#else + return gettimeofday(&val, NULL); +#endif +} + + #define TIMEVAL_LATER(a, b) \ ((a.tv_sec > b.tv_sec) || \ ((a.tv_sec == b.tv_sec) && \ @@ -63,7 +78,7 @@ static void do_timer_set() } /* Subtract queue time from current time, don't go below zero */ - gettimeofday(&(val.it_value), NULL); + mainloop_gettime(&(val.it_value)); if(TIMEVAL_LATER((queue)->when, val.it_value)){ if(queue->when.tv_usecwhen.tv_usec+=USECS_IN_SEC; @@ -193,7 +208,7 @@ bool mainloop_check_signals() /* Check for timer events in the queue */ while(had_tmr && queue!=NULL){ had_tmr=FALSE; - gettimeofday(¤t_time, NULL); + mainloop_gettime(¤t_time); while(queue!=NULL){ if(TIMEVAL_LATER(current_time, queue->when)){ q=queue; @@ -228,7 +243,7 @@ static void add_to_current_time(struct timeval *when, uint msecs) { long tmp_usec; - gettimeofday(when, NULL); + mainloop_gettime(when); tmp_usec=when->tv_usec + (msecs * 1000); when->tv_usec=tmp_usec % 1000000; when->tv_sec+=tmp_usec / 1000000;