Browse Source

don't get system time when dealing with null timers

they fire immediately regardless of wall time, so we can save some
pointless syscalls.
Oswald Buddenhagen 10 years ago
parent
commit
e0171b71e7
1 changed files with 8 additions and 7 deletions
  1. 8 7
      src/util.c

+ 8 - 7
src/util.c

@@ -727,12 +727,12 @@ conf_wakeup( wakeup_t *tmr, int to )
 		if (tmr->links.next)
 		if (tmr->links.next)
 			list_unlink( &tmr->links );
 			list_unlink( &tmr->links );
 	} else {
 	} else {
-		time_t timeout = get_now() + to;
-		tmr->timeout = timeout;
+		time_t timeout = to;
 		if (!to) {
 		if (!to) {
 			/* We always prepend null timers, to cluster related events. */
 			/* We always prepend null timers, to cluster related events. */
 			succ = timers.next;
 			succ = timers.next;
 		} else {
 		} else {
+			timeout += get_now();
 			/* We start at the end in the expectation that the newest timer is likely to fire last
 			/* 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). */
 			 * (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) {
 			for (succ = &timers; (head = succ->prev) != &timers; succ = head) {
@@ -741,6 +741,7 @@ conf_wakeup( wakeup_t *tmr, int to )
 			}
 			}
 			assert( head != &tmr->links );
 			assert( head != &tmr->links );
 		}
 		}
+		tmr->timeout = timeout;
 		if (succ != &tmr->links) {
 		if (succ != &tmr->links) {
 			if (tmr->links.next)
 			if (tmr->links.next)
 				list_unlink( &tmr->links );
 				list_unlink( &tmr->links );
@@ -766,13 +767,13 @@ event_wait( void )
 	nowvalid = 0;
 	nowvalid = 0;
 	if ((head = timers.next) != &timers) {
 	if ((head = timers.next) != &timers) {
 		wakeup_t *tmr = (wakeup_t *)head;
 		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 );
 			list_unlink( head );
 			tmr->cb( tmr->aux );
 			tmr->cb( tmr->aux );
 			return;
 			return;
 		}
 		}
-		timeout = delta * 1000;
+		timeout = (int)delta * 1000;
 	}
 	}
 	switch (poll( pollfds, npolls, timeout )) {
 	switch (poll( pollfds, npolls, timeout )) {
 	case 0:
 	case 0:
@@ -803,8 +804,8 @@ event_wait( void )
 	nowvalid = 0;
 	nowvalid = 0;
 	if ((head = timers.next) != &timers) {
 	if ((head = timers.next) != &timers) {
 		wakeup_t *tmr = (wakeup_t *)head;
 		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 );
 			list_unlink( head );
 			tmr->cb( tmr->aux );
 			tmr->cb( tmr->aux );
 			return;
 			return;