/* Time at which to die with SIGALRM (if not TIME_MIN). */
static time_t deadline = TIME_MIN;
+static void set_up_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. */
+ set_up_timer();
+}
+
+static void
+set_up_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)
+{
+ set_up_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. */
rusage.ru_nvcsw - last_rusage->ru_nvcsw,
rusage.ru_nivcsw - last_rusage->ru_nivcsw);
}
- coverage_log(VLL_WARN, true);
+
+ /* Care should be taken in the value chosen for logging. Depending
+ * on the configuration, syslog can write changes synchronously,
+ * which can cause the coverage messages to take longer to log
+ * than the processing delay that triggered it. */
+ coverage_log(VLL_INFO, true);
}
/* Update exponentially weighted moving average. With these parameters, a