X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=libmainloop%2Fsignal.c;h=37ee995f507da6818d8b0c622d9a9782ef12a0c4;hb=214381793227e299ae1e72caa24ad2cfde029ef1;hp=ddf6aba40cf582115bb133596c4b2b0aa39072de;hpb=8366314611bf30a0f31d25bf5f5023186fa87692;p=ion3.git diff --git a/libmainloop/signal.c b/libmainloop/signal.c index ddf6aba..37ee995 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 @@ -17,6 +14,7 @@ #include #include #include +#include #include #include @@ -45,6 +43,34 @@ WHook *mainloop_sigusr2_hook=NULL; static WTimer *queue=NULL; +int mainloop_gettime(struct timeval *val) +{ +#if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK>=0) + struct timespec spec; + int ret; + static int checked=0; + + if(checked>=0){ + ret=clock_gettime(CLOCK_MONOTONIC, &spec); + + if(ret==-1 && errno==EINVAL && checked==0){ + checked=-1; + }else{ + checked=1; + + val->tv_sec=spec.tv_sec; + val->tv_usec=spec.tv_nsec/1000; + + return ret; + } + } +#else + #warning "Monotonic clock unavailable; please fix your operating system." +#endif + return gettimeofday(val, NULL); +} + + #define TIMEVAL_LATER(a, b) \ ((a.tv_sec > b.tv_sec) || \ ((a.tv_sec == b.tv_sec) && \ @@ -63,7 +89,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 +219,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 +254,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;