chiark / gitweb /
event loop: make tv_now and now into globals
authorIan Jackson <>
Mon, 16 May 2011 10:09:13 +0000 (11:09 +0100)
committerIan Jackson <>
Sun, 26 Jun 2011 11:07:26 +0000 (12:07 +0100)
This makes these values available to all functions in the rest of the
program, even if the particular event before/after function doesn't
pass them on.

We give variables new names so that we can introduce convenience
pointer aliases; that way, all the other references in the whole
program can remain unchanged when we remove now and tv_now from the
beforepoll/afterpoll parameter lists.

The pointer aliases are "static const *const" which is somewhat ugly.
We do this in the hope that the compiler will optimise out the actual
variable, which it couldn't do if the pointer alias had external
linkage.  The alternative would be a macro but we don't want to
local scopes (and not just in the current before/afterpoll api).

Signed-off-by: Ian Jackson <>

index 7869182..f56fac2 100644 (file)
--- a/secnet.c
+++ b/secnet.c
@@ -247,10 +247,11 @@ static void system_phase_hook(void *sst, uint32_t newphase)
+struct timeval tv_now_global;
+uint64_t now_global;
 static void run(void)
-    struct timeval tv_now;
-    uint64_t now;
     struct poll_interest *i;
     int rv, nfds, remain, idx;
     int timeout;
@@ -261,14 +262,14 @@ static void run(void)
     Message(M_NOTICE,"%s [%d]: starting\n",version,secnet_pid);
     do {
-       if (gettimeofday(&tv_now, NULL)!=0) {
+       if (gettimeofday(&tv_now_global, NULL)!=0) {
            fatal_perror("main loop: gettimeofday");
-       now=((uint64_t)tv_now.tv_sec*(uint64_t)1000)+
-           ((uint64_t)tv_now.tv_usec/(uint64_t)1000);
+       now_global=((uint64_t)tv_now_global.tv_sec*(uint64_t)1000)+
+                  ((uint64_t)tv_now_global.tv_usec/(uint64_t)1000);
        for (i=reg; i; i=i->next) {
-           i->after(i->state, fds+idx, i->nfds, &tv_now, &now);
+           i->after(i->state, fds+idx, i->nfds, &tv_now_global, &now_global);
@@ -276,7 +277,7 @@ static void run(void)
        for (i=reg; i; i=i->next) {
-           rv=i->before(i->state, fds+idx, &nfds, &timeout, &tv_now, &now);
+           rv=i->before(i->state, fds+idx, &nfds, &timeout, &tv_now_global, &now_global);
            if (rv!=0) {
                /* XXX we need to handle this properly: increase the
                   nfds available */
index 3186ac2..2439f14 100644 (file)
--- a/secnet.h
+++ b/secnet.h
@@ -148,6 +148,15 @@ extern void *safe_malloc_ary(size_t size, size_t count, const char *message);
 extern int sys_cmd(const char *file, const char *argc, ...);
+extern uint64_t now_global;
+extern struct timeval tv_now_global;
+static const uint64_t       *const now    = &now_global;
+static const struct timeval *const tv_now = &tv_now_global;
+/* "now" is current program time, in milliseconds. It is derived
+   from tv_now. Both are provided by the event loop. */
 /***** END of utility functions *****/
 /***** SCHEDULING support */