diff options
-rw-r--r-- | lib/daemon.c | 2 | ||||
-rw-r--r-- | lib/timeval.c | 24 | ||||
-rw-r--r-- | lib/timeval.h | 1 |
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); |