updates.
[silc.git] / lib / silcutil / silcschedule.c
index 1d0814264e8e04f1004cf204233c31df55c85988..5929720daf4ed2c6c770a891a04359996cd9b4ba 100644 (file)
@@ -119,7 +119,7 @@ void silc_schedule_stop()
    call this directly if wanted. This can be called multiple times for
    one file descriptor to set different iomasks. */
 
-void silc_schedule_set_listen_fd(int fd, unsigned int iomask)
+void silc_schedule_set_listen_fd(int fd, uint32 iomask)
 {
   assert(schedule.valid != FALSE);
   assert(fd < schedule.fd_list.max_fd);
@@ -328,10 +328,14 @@ do {                                                                          \
           /* Calculate the next timeout for select() */                            \
           queue->timeout.tv_sec = task->timeout.tv_sec - curtime.tv_sec;    \
           queue->timeout.tv_usec = task->timeout.tv_usec - curtime.tv_usec; \
+         if (queue->timeout.tv_sec < 0)                                    \
+            queue->timeout.tv_sec = 0;                                             \
                                                                            \
           /* We wouldn't want to go under zero, check for it. */           \
           if (queue->timeout.tv_usec < 0) {                                \
             queue->timeout.tv_sec -= 1;                                            \
+           if (queue->timeout.tv_sec < 0)                                  \
+              queue->timeout.tv_sec = 0;                                   \
             queue->timeout.tv_usec += 1000000L;                                    \
           }                                                                \
         }                                                                  \
@@ -452,10 +456,8 @@ int silc_schedule_one(int timeout_usecs)
      tasks. The select() listens to these file descriptors. */
   SILC_SCHEDULE_SELECT_TASKS;
 
-  if (schedule.max_fd == -1) {
-    /*SILC_LOG_ERROR(("Nothing to listen, exiting"));*/
+  if (schedule.max_fd == -1 && !schedule.timeout)
     return FALSE;
-  }
 
   if (schedule.timeout) {
     SILC_LOG_DEBUG(("timeout: sec=%d, usec=%d", schedule.timeout->tv_sec,
@@ -476,6 +478,14 @@ int silc_schedule_one(int timeout_usecs)
                 &schedule.out, 0, schedule.timeout)) {
   case -1:
     /* Error */
+    if (errno == EINTR)
+      break;
+#if 1
+    if (errno == EINVAL && schedule.timeout) {
+      SILC_LOG_ERROR(("Invalid argument (invalid timeout): %lu %lu",
+                     schedule.timeout->tv_sec, schedule.timeout->tv_usec));
+    }
+#endif
     SILC_LOG_ERROR(("Error in select(): %s", strerror(errno)));
     break;
   case 0:
@@ -509,5 +519,6 @@ void silc_schedule()
   }
 
   /* Start the scheduler loop */
-  while (silc_schedule_one(-1)) ;
+  while (silc_schedule_one(-1)) 
+    ;
 }