ソースを参照

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 年 前
コミット
e0171b71e7
1 ファイル変更8 行追加7 行削除
  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)
 			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;