X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;f=source3%2Flib%2Fevents.c;h=8c56941829002030cbb654beb1fcc7d030c1e37b;hb=bd0f14c1d782b6afe9455e61819caeb2d480af1e;hp=8deaa18edba29a968da8aa08d68fa968a0b59dd7;hpb=d524e5f4174e4f7578595bf6cd22a6d161b6e324;p=ira%2Fwip.git diff --git a/source3/lib/events.c b/source3/lib/events.c index 8deaa18edba..8c569418290 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -83,40 +83,24 @@ bool event_add_to_select_args(struct tevent_context *ev, bool run_events(struct tevent_context *ev, int selrtn, fd_set *read_fds, fd_set *write_fds) { - bool fired = false; - struct tevent_fd *fde, *next; - - /* Run all events that are pending, not just one (as we - did previously. */ - - while (ev->timer_events) { - struct timeval now; - GetTimeOfDay(&now); + struct tevent_fd *fde; + struct timeval now; - if (timeval_compare( - &now, &ev->timer_events->next_event) < 0) { - /* Nothing to do yet */ - DEBUG(11, ("run_events: Nothing to do\n")); - break; - } + if (ev->signal_events && + tevent_common_check_signal(ev)) { + return true; + } - DEBUG(10, ("Running event \"%s\" %p\n", - ev->timer_events->handler_name, - ev->timer_events)); + GetTimeOfDay(&now); - ev->timer_events->handler( - ev, - ev->timer_events, now, - ev->timer_events->private_data); + if ((ev->timer_events != NULL) + && (timeval_compare(&now, &ev->timer_events->next_event) >= 0)) { - fired = true; - } + DEBUG(10, ("Running timed event \"%s\" %p\n", + ev->timer_events->handler_name, ev->timer_events)); - if (fired) { - /* - * We might have changed the socket status during the timed - * events, return to run select again. - */ + ev->timer_events->handler(ev, ev->timer_events, now, + ev->timer_events->private_data); return true; } @@ -124,23 +108,22 @@ bool run_events(struct tevent_context *ev, /* * No fd ready */ - return fired; + return false; } - for (fde = ev->fd_events; fde; fde = next) { + for (fde = ev->fd_events; fde; fde = fde->next) { uint16 flags = 0; - next = fde->next; if (FD_ISSET(fde->fd, read_fds)) flags |= EVENT_FD_READ; if (FD_ISSET(fde->fd, write_fds)) flags |= EVENT_FD_WRITE; if (flags & fde->flags) { fde->handler(ev, fde, flags, fde->private_data); - fired = true; + return true; } } - return fired; + return false; } @@ -162,7 +145,7 @@ struct timeval *get_timed_events_timeout(struct tevent_context *ev, return to_ret; } -static int s3_event_loop_once(struct tevent_context *ev) +static int s3_event_loop_once(struct tevent_context *ev, const char *location) { struct timeval now, to; fd_set r_fds, w_fds; @@ -175,17 +158,16 @@ static int s3_event_loop_once(struct tevent_context *ev) to.tv_sec = 9999; /* Max timeout */ to.tv_usec = 0; + if (run_events(ev, 0, NULL, NULL)) { + return 0; + } + GetTimeOfDay(&now); if (!event_add_to_select_args(ev, &now, &r_fds, &w_fds, &to, &maxfd)) { return -1; } - if (timeval_is_zero(&to)) { - run_events(ev, 0, NULL, NULL); - return 0; - } - ret = sys_select(maxfd+1, &r_fds, &w_fds, NULL, &to); if (ret == -1 && errno != EINTR) { @@ -199,12 +181,12 @@ static int s3_event_loop_once(struct tevent_context *ev) return 0; } -static int s3_event_loop_wait(struct tevent_context *ev) +static int s3_event_loop_wait(struct tevent_context *ev, const char *location) { int ret = 0; while (ret == 0) { - ret = s3_event_loop_once(ev); + ret = s3_event_loop_once(ev, location); } return ret; @@ -262,6 +244,7 @@ static const struct tevent_ops s3_event_ops = { .get_fd_flags = tevent_common_fd_get_flags, .set_fd_flags = tevent_common_fd_set_flags, .add_timer = tevent_common_add_timer, + .add_signal = tevent_common_add_signal, .loop_once = s3_event_loop_once, .loop_wait = s3_event_loop_wait, }; @@ -299,12 +282,13 @@ static void s3_event_debug(void *context, enum tevent_debug_level level, samba_level = 2; break; case TEVENT_DEBUG_TRACE: - samba_level = 5; + samba_level = 10; break; }; - vasprintf(&s, fmt, ap); - if (!s) return; + if (vasprintf(&s, fmt, ap) == -1) { + return; + } DEBUG(samba_level, ("s3_event: %s", s)); free(s); }