s3:lib/events: make use of tevent_common_loop_timer_delay()
authorStefan Metzmacher <metze@samba.org>
Fri, 1 Mar 2013 08:27:29 +0000 (09:27 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 1 Mar 2013 08:37:15 +0000 (09:37 +0100)
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 <metze@samba.org>
source3/lib/events.c

index 0a8039ac6ea8c3d1ab8cb136f0e96343583bbccd..62aa4d973e94bb869dbe8004249371e80192ee4b 100644 (file)
@@ -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
                 */