fixed a logic bug in the tevent nesting code
authorAndrew Tridgell <tridge@samba.org>
Thu, 19 Mar 2009 00:21:36 +0000 (11:21 +1100)
committerAndrew Tridgell <tridge@samba.org>
Thu, 19 Mar 2009 00:21:36 +0000 (11:21 +1100)
The event nesting code never triggered as nesting.level was never
greater than 1. The main event loop needs to increase the nesting
level by 1.

I also added a paranoia check to the nesting setup call. The API as
currently written cannot support multiple nesting hooks, so we need to
abort if multiple hooks are tried.

lib/tevent/tevent.c

index ba2d93f4b98051e7f3abadc45a675c58b1a12b5e..56fd6aec7aa54d2957f8bdcaf7e9e80a80655023 100644 (file)
@@ -427,6 +427,14 @@ void tevent_loop_set_nesting_hook(struct tevent_context *ev,
                                  tevent_nesting_hook hook,
                                  void *private_data)
 {
                                  tevent_nesting_hook hook,
                                  void *private_data)
 {
+       if (ev->nesting.hook_fn && 
+           (ev->nesting.hook_fn != hook ||
+            ev->nesting.hook_private != private_data)) {
+               /* the way the nesting hook code is currently written
+                  we cannot support two different nesting hooks at the
+                  same time. */
+               tevent_abort(ev, "tevent: Violation of nesting hook rules\n");
+       }
        ev->nesting.hook_fn = hook;
        ev->nesting.hook_private = private_data;
 }
        ev->nesting.hook_fn = hook;
        ev->nesting.hook_private = private_data;
 }
@@ -593,5 +601,9 @@ int tevent_common_loop_wait(struct tevent_context *ev,
 */
 int _tevent_loop_wait(struct tevent_context *ev, const char *location)
 {
 */
 int _tevent_loop_wait(struct tevent_context *ev, const char *location)
 {
-       return ev->ops->loop_wait(ev, location);
+       int ret;
+       ev->nesting.level++;
+       ret = ev->ops->loop_wait(ev, location);
+       ev->nesting.level--;
+       return ret;
 }
 }