draft bugfix to the times(2) overrun situation
authorBernd Petrovitsch <bernd@firmix.at>
Tue, 2 Sep 2008 23:03:14 +0000 (01:03 +0200)
committerBernd Petrovitsch <bernd@firmix.at>
Tue, 2 Sep 2008 23:03:14 +0000 (01:03 +0200)
src/defs.h
src/main.c
src/scheduler.c
src/socket_parser.c

index 0bab201..016a1db 100644 (file)
@@ -177,6 +177,15 @@ extern olsr_bool olsr_win32_end_request;
 extern olsr_bool olsr_win32_end_flag;
 #endif
 
+/*
+ * a wrapper around times(2). times(2) has the problem, that it may return -1
+ * in case of an err (e.g. EFAULT on the parameter) or immediately before an
+ * overrun (though it is not en error) just because the jiffies (or whatever
+ * the underlying kernel calls the smallest accountable time unit) are
+ * inherently "unsigned" (and always incremented).
+ */
+unsigned long olsr_times(void);
+
 /*
  *IPC functions
  *These are moved to a plugin soon
index 7162862..9c0b293 100644 (file)
@@ -108,7 +108,6 @@ main(int argc, char *argv[])
 {
   struct if_config_options *default_ifcnf;
   char conf_file_name[FILENAME_MAX];
-  struct tms tms_buf;
   struct ipaddr_str buf;
 #ifdef WIN32
   WSADATA WsaData;
@@ -151,7 +150,7 @@ main(int argc, char *argv[])
   olsr_openlog("olsrd");
 
   /* Grab initial timestamp */
-  now_times = times(&tms_buf);
+  now_times = olsr_times();
     
   printf("\n *** %s ***\n Build date: %s on %s\n http://www.olsr.org\n\n", 
         olsrd_version, 
@@ -889,6 +888,20 @@ olsr_process_arguments(int argc, char *argv[],
   return 0;
 }
 
+/*
+ * a wrapper around times(2). times(2) has the problem, that it may return -1
+ * in case of an err (e.g. EFAULT on the parameter) or immediately before an
+ * overrun (though it is not en error) just because the jiffies (or whatever
+ * the underlying kernel calls the smallest accountable time unit) are
+ * inherently "unsigned" (and always incremented).
+ */
+unsigned long olsr_times(void)
+{
+  struct tms tms_buf;
+  const long t = times(&tms_buf);
+  return t < 0 ? -errno : t;
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2
index 5ba29c7..394504c 100644 (file)
@@ -78,12 +78,12 @@ unsigned int timers_running;
  * @return nada
  */
 static void
-olsr_scheduler_sleep(clock_t scheduler_runtime)
+olsr_scheduler_sleep(unsigned long scheduler_runtime)
 {
   struct timespec remainder_spec, sleeptime_spec;
   struct timeval sleeptime_val, time_used, next_interval;
   olsr_u32_t next_interval_usec;
-  clock_t milliseconds_used;
+  unsigned long milliseconds_used;
 
   /* Calculate next planned scheduler invocation */
   next_interval_usec = olsr_cnf->pollrate * USEC_PER_SEC;
@@ -118,7 +118,6 @@ olsr_scheduler_sleep(clock_t scheduler_runtime)
 void
 olsr_scheduler(void)
 {
-  struct tms tms_buf;                 /* Buffer for times(2) calls. */
   struct interface *ifn;
 
   OLSR_PRINTF(1, "Scheduler started - polling every %0.2f seconds\n",
@@ -132,7 +131,7 @@ olsr_scheduler(void)
      * Update the global timestamp. We are using a non-wallclock timer here
      * to avoid any undesired side effects if the system clock changes.
      */
-    now_times = times(&tms_buf);
+    now_times = olsr_times();
 
     /* Read incoming data */
     olsr_poll_sockets();
@@ -158,7 +157,7 @@ olsr_scheduler(void)
     }
 
     /* We are done, sleep until the next scheduling interval. */
-    olsr_scheduler_sleep(times(&tms_buf) - now_times);
+    olsr_scheduler_sleep(olsr_times() - now_times);
 
 #if defined WIN32
     /* The Ctrl-C signal handler thread asks us to exit */
index da21b7b..679f538 100644 (file)
@@ -157,8 +157,6 @@ olsr_poll_sockets(void)
 {
   int n;
   struct olsr_socket_entry *olsr_sockets;
-  /* Global buffer for times(2) calls. Do not remove since at least OpenBSD needs it. */
-  struct tms tms_buf;
   fd_set ibits;
   struct timeval tvp = {0, 0};
 
@@ -195,7 +193,7 @@ olsr_poll_sockets(void)
     }
 
   /* Update time since this is much used by the parsing functions */
-  now_times = times(&tms_buf);
+  now_times = olsr_times();
 
   for(olsr_sockets = olsr_socket_entries;olsr_sockets;olsr_sockets = olsr_sockets->next)
     {