isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit e0171b71e792fd30cd6242427faa597cde22e9d7
parent 59ac6b3f2058a97a7f91c22457552fa7ff80dc0e
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Sun, 26 Apr 2015 18:34:14 +0200

don't get system time when dealing with null timers

they fire immediately regardless of wall time, so we can save some
pointless syscalls.

Diffstat:
Msrc/util.c | 15++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/util.c b/src/util.c @@ -727,12 +727,12 @@ conf_wakeup( wakeup_t *tmr, int to ) if (tmr->links.next) list_unlink( &tmr->links ); } else { - time_t timeout = get_now() + to; - tmr->timeout = timeout; + time_t timeout = to; if (!to) { /* We always prepend null timers, to cluster related events. */ succ = timers.next; } else { + timeout += get_now(); /* We start at the end in the expectation that the newest timer is likely to fire last * (which will be true only if all timeouts are equal, but it's an as good guess as any). */ for (succ = &timers; (head = succ->prev) != &timers; succ = head) { @@ -741,6 +741,7 @@ conf_wakeup( wakeup_t *tmr, int to ) } assert( head != &tmr->links ); } + tmr->timeout = timeout; if (succ != &tmr->links) { if (tmr->links.next) list_unlink( &tmr->links ); @@ -766,13 +767,13 @@ event_wait( void ) nowvalid = 0; if ((head = timers.next) != &timers) { wakeup_t *tmr = (wakeup_t *)head; - int delta = tmr->timeout - get_now(); - if (delta <= 0) { + time_t delta = tmr->timeout; + if (!delta || (delta -= get_now()) <= 0) { list_unlink( head ); tmr->cb( tmr->aux ); return; } - timeout = delta * 1000; + timeout = (int)delta * 1000; } switch (poll( pollfds, npolls, timeout )) { case 0: @@ -803,8 +804,8 @@ event_wait( void ) nowvalid = 0; if ((head = timers.next) != &timers) { wakeup_t *tmr = (wakeup_t *)head; - int delta = tmr->timeout - get_now(); - if (delta <= 0) { + time_t delta = tmr->timeout; + if (!delta || (delta -= get_now()) <= 0) { list_unlink( head ); tmr->cb( tmr->aux ); return;