TODO- s3:winbindd: use tevent_loop_wait() in the main loop
authorMichael Adam <obnox@samba.org>
Tue, 26 Feb 2013 16:38:14 +0000 (17:38 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 4 Oct 2016 12:51:58 +0000 (14:51 +0200)
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>

TODO: also child ...
TODO: let winbindd_tevent_trace_state be a stack variable,
      similar to 1d615ee923a2b46ffd7f943a9ba9e362b6322e5e
      and 9afc37bef4e60ea4a13db8ae68ba30d73b5b719c

source3/winbindd/winbindd.c
source3/winbindd/winbindd_dual.c

index f79dc478a77c0e8bc2d29e2070883c4a5c705650..5f26b08669f91c5a4c64e77e06bb468d1634e6d9 100644 (file)
@@ -1508,6 +1508,34 @@ static void winbindd_addr_changed(struct tevent_req *req)
        tevent_req_set_callback(req, winbindd_addr_changed, state);
 }
 
+
+struct winbindd_tevent_trace_state {
+       TALLOC_CTX *frame;
+};
+
+static void winbindd_tevent_trace_callback(enum tevent_trace_point point,
+                                          void *private_data)
+{
+       struct winbindd_tevent_trace_state *state =
+               talloc_get_type_abort(private_data,
+                                     struct winbindd_tevent_trace_state);
+
+       switch (point) {
+       case TEVENT_TRACE_BEFORE_WAIT:
+       case TEVENT_TRACE_AFTER_WAIT:
+               break;
+       case TEVENT_TRACE_BEFORE_LOOP_ONCE:
+               TALLOC_FREE(state->frame);
+               state->frame = talloc_stackframe();
+               errno = 0;
+               break;
+       case TEVENT_TRACE_AFTER_LOOP_ONCE:
+               TALLOC_FREE(state->frame);
+               break;
+       }
+}
+
+
 /* Main function */
 
 int main(int argc, const char **argv)
@@ -1538,6 +1566,9 @@ int main(int argc, const char **argv)
        TALLOC_CTX *frame;
        NTSTATUS status;
        bool ok;
+       int ret = 0;
+       struct tevent_context *ev_ctx = NULL;
+       struct winbindd_tevent_trace_state *trace_state = NULL;
 
        /*
         * Do this before any other talloc operation
@@ -1707,7 +1738,7 @@ int main(int argc, const char **argv)
        if (!init_names())
                exit(1);
 
-       load_interfaces();
+       load_interfaces();
 
        if (!secrets_init()) {
 
@@ -1803,17 +1834,34 @@ int main(int argc, const char **argv)
        }
 
        /* Loop waiting for requests */
-       while (1) {
-               frame = talloc_stackframe();
 
-               if (tevent_loop_once(winbind_event_context()) == -1) {
-                       DEBUG(1, ("tevent_loop_once() failed: %s\n",
-                                 strerror(errno)));
-                       return 1;
-               }
+       ev_ctx = winbind_event_context();
+       if (ev_ctx == NULL) {
+               DEBUG(0, ("%s: winbind_event_context() failed\n",
+                         __location__));
+               exit(1);
+       }
 
-               TALLOC_FREE(frame);
+       trace_state = talloc_zero(ev_ctx, struct winbindd_tevent_trace_state);
+       if (trace_state == NULL) {
+               DEBUG(0, ("talloc_zero(winbindd_tevent_trace_state).\n"));
+               exit(1);
        }
 
+       trace_state->frame = frame;
+       frame = NULL;
+
+       tevent_set_trace_callback(ev_ctx, winbindd_tevent_trace_callback,
+                                 trace_state);
+
+       ret = tevent_loop_wait(ev_ctx);
+       if (ret != 0) {
+               DEBUG(0, ("tevent_loop_wait failed: %d, %s, exiting\n",
+                         ret, strerror(errno)));
+               exit(1);
+       }
+
+       TALLOC_FREE(trace_state->frame);
+
        return 0;
 }
index c16b94e2be3459189be989939a5d01f5c1782839..9bea4b78a4b4ae18bd4a5c88ffbbf84853117a4f 100644 (file)
@@ -1587,7 +1587,6 @@ static bool fork_domain_child(struct winbindd_child *child)
        while (1) {
 
                int ret;
-               TALLOC_CTX *frame = talloc_stackframe();
 
                ret = tevent_loop_once(winbind_event_context());
                if (ret != 0) {
@@ -1603,8 +1602,6 @@ static bool fork_domain_child(struct winbindd_child *child)
                                child->domain->name ));
                        child->domain->startup = False;
                }
-
-               TALLOC_FREE(frame);
        }
 }