tevent: add tevent_common_loop_wait() helper function and use it
authorStefan Metzmacher <metze@samba.org>
Mon, 16 Mar 2009 13:15:07 +0000 (14:15 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 17 Mar 2009 18:58:57 +0000 (19:58 +0100)
tevent_loop_wait should do the same for all backends.
It should loop as long as we have pending events.

metze

lib/tevent/tevent.c
lib/tevent/tevent_epoll.c
lib/tevent/tevent_internal.h
lib/tevent/tevent_select.c
lib/tevent/tevent_standard.c

index 867cfc08feff88c3532a98f76c94d1f5b8fb0e47..31dc58d98e8c42cb2a453fa793e357f44170bd8c 100644 (file)
@@ -511,6 +511,34 @@ done:
        return ret;
 }
 
+/*
+  return on failure or (with 0) if all fd events are removed
+*/
+int tevent_common_loop_wait(struct tevent_context *ev,
+                           const char *location)
+{
+       /*
+        * loop as long as we have events pending
+        */
+       while (ev->fd_events ||
+              ev->timer_events ||
+              ev->immediate_events ||
+              ev->signal_events) {
+               int ret;
+               ret = _tevent_loop_once(ev, location);
+               if (ret != 0) {
+                       tevent_debug(ev, TEVENT_DEBUG_FATAL,
+                                    "_tevent_loop_once() failed: %d - %s\n",
+                                    ret, strerror(errno));
+                       return ret;
+               }
+       }
+
+       tevent_debug(ev, TEVENT_DEBUG_WARNING,
+                    "tevent_common_loop_wait() out of events\n");
+       return 0;
+}
+
 /*
   return on failure or (with 0) if all fd events are removed
 */
index 6c960c74918930cce15128fdd6b052362add8013..32544593de06e2e7016040036e650d7a14390b2b 100644 (file)
@@ -419,22 +419,6 @@ static int epoll_event_loop_once(struct tevent_context *ev, const char *location
        return epoll_event_loop(epoll_ev, &tval);
 }
 
-/*
-  return on failure or (with 0) if all fd events are removed
-*/
-static int epoll_event_loop_wait(struct tevent_context *ev, const char *location)
-{
-       struct epoll_event_context *epoll_ev = talloc_get_type(ev->additional_data,
-                                                          struct epoll_event_context);
-       while (epoll_ev->ev->fd_events) {
-               if (epoll_event_loop_once(ev, location) != 0) {
-                       break;
-               }
-       }
-
-       return 0;
-}
-
 static const struct tevent_ops epoll_event_ops = {
        .context_init   = epoll_event_context_init,
        .add_fd         = epoll_event_add_fd,
@@ -444,7 +428,7 @@ static const struct tevent_ops epoll_event_ops = {
        .add_timer      = tevent_common_add_timer,
        .add_signal     = tevent_common_add_signal,
        .loop_once      = epoll_event_loop_once,
-       .loop_wait      = epoll_event_loop_wait,
+       .loop_wait      = tevent_common_loop_wait,
 };
 
 bool tevent_epoll_init(void)
index f10485398f147315d6c71e3058734795f4fb38f7..f63a58aadda7f8cf4436e32a658ef1d3a47fec4d 100644 (file)
@@ -247,6 +247,8 @@ struct tevent_context {
 bool tevent_register_backend(const char *name, const struct tevent_ops *ops);
 
 int tevent_common_context_destructor(struct tevent_context *ev);
+int tevent_common_loop_wait(struct tevent_context *ev,
+                           const char *location);
 
 int tevent_common_fd_destructor(struct tevent_fd *fde);
 struct tevent_fd *tevent_common_add_fd(struct tevent_context *ev,
index b666b4fba4ac2cf02713debac13f22e376d58ca7..1c295d7ca471267d598b1ee6c88871b9caaa0118 100644 (file)
@@ -223,24 +223,6 @@ static int select_event_loop_once(struct tevent_context *ev, const char *locatio
        return select_event_loop_select(select_ev, &tval);
 }
 
-/*
-  return on failure or (with 0) if all fd events are removed
-*/
-static int select_event_loop_wait(struct tevent_context *ev, const char *location)
-{
-       struct select_event_context *select_ev = talloc_get_type(ev->additional_data,
-                                                          struct select_event_context);
-       select_ev->exit_code = 0;
-
-       while (ev->fd_events && select_ev->exit_code == 0) {
-               if (select_event_loop_once(ev, location) != 0) {
-                       break;
-               }
-       }
-
-       return select_ev->exit_code;
-}
-
 static const struct tevent_ops select_event_ops = {
        .context_init   = select_event_context_init,
        .add_fd         = select_event_add_fd,
@@ -250,7 +232,7 @@ static const struct tevent_ops select_event_ops = {
        .add_timer      = tevent_common_add_timer,
        .add_signal     = tevent_common_add_signal,
        .loop_once      = select_event_loop_once,
-       .loop_wait      = select_event_loop_wait,
+       .loop_wait      = tevent_common_loop_wait,
 };
 
 bool tevent_select_init(void)
index 40a08d7ab0812b707393bfa06ea64c8a3960a136..88db6a172576422c8c66d9739b8f956abb925028 100644 (file)
@@ -543,24 +543,6 @@ static int std_event_loop_once(struct tevent_context *ev, const char *location)
        return std_event_loop_select(std_ev, &tval);
 }
 
-/*
-  return on failure or (with 0) if all fd events are removed
-*/
-static int std_event_loop_wait(struct tevent_context *ev, const char *location)
-{
-       struct std_event_context *std_ev = talloc_get_type(ev->additional_data,
-                                                          struct std_event_context);
-       std_ev->exit_code = 0;
-
-       while (ev->fd_events && std_ev->exit_code == 0) {
-               if (std_event_loop_once(ev, location) != 0) {
-                       break;
-               }
-       }
-
-       return std_ev->exit_code;
-}
-
 static const struct tevent_ops std_event_ops = {
        .context_init   = std_event_context_init,
        .add_fd         = std_event_add_fd,
@@ -570,7 +552,7 @@ static const struct tevent_ops std_event_ops = {
        .add_timer      = tevent_common_add_timer,
        .add_signal     = tevent_common_add_signal,
        .loop_once      = std_event_loop_once,
-       .loop_wait      = std_event_loop_wait,
+       .loop_wait      = tevent_common_loop_wait,
 };