From: Ian Jackson Date: Mon, 16 May 2011 10:09:13 +0000 (+0100) Subject: event loop: make tv_now and now into globals X-Git-Tag: v0.2.0~70 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=commitdiff_plain;h=698280de07c723fed8c707e56bce81b66fee9c52;ds=sidebyside event loop: make tv_now and now into globals 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 --- diff --git a/secnet.c b/secnet.c index 7869182..f56fac2 100644 --- 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); idx=0; 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); idx+=i->nfds; } remain=total_nfds; @@ -276,7 +277,7 @@ static void run(void) timeout=-1; for (i=reg; i; i=i->next) { nfds=remain; - 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 */ diff --git a/secnet.h b/secnet.h index 3186ac2..2439f14 100644 --- 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 */