Make sure that time advances in a daemon between calls to time_refresh().
[sliver-openvswitch.git] / lib / timeval.c
index 3cca338..314b3f4 100644 (file)
@@ -43,6 +43,7 @@ static struct timeval now;
 /* Time at which to die with SIGALRM (if not TIME_MIN). */
 static time_t deadline = TIME_MIN;
 
+static void setup_timer(void);
 static void sigalrm_handler(int);
 static void refresh_if_ticked(void);
 static time_t time_add(time_t, time_t);
@@ -57,8 +58,6 @@ void
 time_init(void)
 {
     struct sigaction sa;
-    struct itimerval itimer;
-
     if (inited) {
         return;
     }
@@ -78,7 +77,15 @@ time_init(void)
         ovs_fatal(errno, "sigaction(SIGALRM) failed");
     }
 
-    /* Set up periodic timer. */
+    /* Set up periodic signal. */
+    setup_timer();
+}
+
+static void
+setup_timer(void)
+{
+    struct itimerval itimer;
+
     itimer.it_interval.tv_sec = 0;
     itimer.it_interval.tv_usec = TIME_UPDATE_INTERVAL * 1000;
     itimer.it_value = itimer.it_interval;
@@ -87,6 +94,17 @@ time_init(void)
     }
 }
 
+/* Set up the interval timer, to ensure that time advances even without calling
+ * time_refresh().
+ *
+ * A child created with fork() does not inherit the parent's interval timer, so
+ * this function needs to be called from the child after fork(). */
+void
+time_postfork(void)
+{
+    setup_timer();
+}
+
 /* Forces a refresh of the current time from the kernel.  It is not usually
  * necessary to call this function, since the time will be refreshed
  * automatically at least every TIME_UPDATE_INTERVAL milliseconds. */