From d9a69e6dbf61cffd6be473a460f6671573aa8564 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 1 Mar 2013 09:27:29 +0100 Subject: s3:lib/events: make use of tevent_common_loop_timer_delay() This is critical as we also use tevent_common_add_timer(). And if the common code does internal changes, it may affects both tevent_common_add_timer() and tevent_common_loop_timer_delay() together! Without this we rely on a specific behavior and version of tevent. Signed-off-by: Stefan Metzmacher Reviewed-by: Jeremy Allison --- source3/lib/events.c | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) (limited to 'source3') diff --git a/source3/lib/events.c b/source3/lib/events.c index 0a8039ac6e..62aa4d973e 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -182,7 +182,6 @@ bool run_events_poll(struct tevent_context *ev, int pollrtn, struct tevent_poll_private *state; int *pollfd_idx; struct tevent_fd *fde; - struct timeval now; if (ev->signal_events && tevent_common_check_signal(ev)) { @@ -194,37 +193,14 @@ bool run_events_poll(struct tevent_context *ev, int pollrtn, return true; } - GetTimeOfDay(&now); - - if ((ev->timer_events != NULL) - && (timeval_compare(&now, &ev->timer_events->next_event) >= 0)) { - /* this older events system did not auto-free timed - events on running them, and had a race condition - where the event could be called twice if the - talloc_free of the te happened after the callback - made a call which invoked the event loop. To avoid - this while still allowing old code which frees the - te, we need to create a temporary context which - will be used to ensure the te is freed. We also - remove the te from the timed event list before we - call the handler, to ensure we can't loop */ - - struct tevent_timer *te = ev->timer_events; - TALLOC_CTX *tmp_ctx = talloc_new(ev); - - DEBUG(10, ("Running timed event \"%s\" %p\n", - ev->timer_events->handler_name, ev->timer_events)); - - DLIST_REMOVE(ev->timer_events, te); - talloc_steal(tmp_ctx, te); - - te->handler(ev, te, now, te->private_data); + if (pollrtn <= 0) { + struct timeval tval; - talloc_free(tmp_ctx); - return true; - } + tval = tevent_common_loop_timer_delay(ev); + if (tevent_timeval_is_zero(&tval)) { + return true; + } - if (pollrtn <= 0) { /* * No fd ready */ -- cgit