summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/daemon.c2
-rw-r--r--lib/timeval.c24
-rw-r--r--lib/timeval.h1
3 files changed, 24 insertions, 3 deletions
diff --git a/lib/daemon.c b/lib/daemon.c
index 1e3f00295..a35c63934 100644
--- a/lib/daemon.c
+++ b/lib/daemon.c
@@ -23,6 +23,7 @@
#include <unistd.h>
#include "fatal-signal.h"
#include "dirs.h"
+#include "timeval.h"
#include "util.h"
#define THIS_MODULE VLM_daemon
@@ -222,6 +223,7 @@ daemonize(void)
if (chdir_) {
chdir("/");
}
+ time_postfork();
break;
case -1:
diff --git a/lib/timeval.c b/lib/timeval.c
index 3cca338fb..314b3f430 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -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. */
diff --git a/lib/timeval.h b/lib/timeval.h
index 660a2074c..8567d7547 100644
--- a/lib/timeval.h
+++ b/lib/timeval.h
@@ -41,6 +41,7 @@ BUILD_ASSERT_DECL(TYPE_IS_SIGNED(time_t));
#define TIME_UPDATE_INTERVAL 100
void time_init(void);
+void time_postfork(void);
void time_refresh(void);
time_t time_now(void);
long long int time_msec(void);