/* 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);
time_init(void)
{
struct sigaction sa;
- struct itimerval itimer;
-
if (inited) {
return;
}
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;
}
}
+/* 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. */