]> git.decadent.org.uk Git - ion3.git/blobdiff - libmainloop/signal.c
Merge commit '20081002' into HEAD
[ion3.git] / libmainloop / signal.c
index fd37161b332689c7073b5065f930ab5e11549428..356fd6d71e495ffc6ea7844febc2d0ae7d9a3962 100644 (file)
@@ -90,13 +90,13 @@ bool libmainloop_get_timeout(struct timeval *tv)
     mainloop_gettime(tv);
     if(TIMEVAL_LATER((queue)->when, (*tv))){
         if(queue->when.tv_usec<tv->tv_usec){
-            queue->when.tv_usec+=USECS_IN_SEC;
-            queue->when.tv_sec--;
+            tv->tv_usec=(queue->when.tv_usec+USECS_IN_SEC)-tv->tv_usec;
+            /* TIMEVAL_LATER ensures >= 0 */
+            tv->tv_sec=(queue->when.tv_sec-1)-tv->tv_sec;
+        }else{
+            tv->tv_usec=queue->when.tv_usec-tv->tv_usec;
+            tv->tv_sec=queue->when.tv_sec-tv->tv_sec;
         }
-        tv->tv_usec=queue->when.tv_usec-tv->tv_usec;
-        tv->tv_sec=queue->when.tv_sec-tv->tv_sec;
-        if(tv->tv_usec<0)
-            tv->tv_usec=0;
         /* POSIX and some kernels have been designed by absolute morons and 
          * contain idiotic artificial restrictions on the value of tv_usec, 
          * that will only cause more code being run and clock cycles being 
@@ -226,8 +226,10 @@ bool mainloop_check_signals()
         return kill_sig;
 
     /* Check for timer events in the queue */
-    while(had_tmr && queue!=NULL){
+    while(had_tmr){
         had_tmr=FALSE;
+        if(queue==NULL)
+            break;
         mainloop_gettime(&current_time);
         while(queue!=NULL){
             if(TIMEVAL_LATER(current_time, queue->when)){