r18243: when setting up a composite continuation, if the context has already
authorAndrew Tridgell <tridge@samba.org>
Fri, 8 Sep 2006 03:06:47 +0000 (03:06 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:17:54 +0000 (14:17 -0500)
finished when we need to trigger the continuation immediately.

Via a fairly complex path, this fixes the problem where all hosts in
the build farm that do not have ipv6 failed a lot of the RPC
tests. This happened because the dcerpc_connect() async code used a
composite_continue() on a context which was already in an error state,
due to the socket backend saying that ipv6 was unavailable
(This used to be commit dbf935d38b6b1fea5ed00e94c9b1a518cb14768b)

source4/libcli/composite/composite.c

index aea25f183efee0a41aca48db2959f3b21f732f53..e690c33f584f5903dc902020a47b0f7fa8ee1225 100644 (file)
@@ -142,6 +142,13 @@ _PUBLIC_ void composite_continue(struct composite_context *ctx,
        if (composite_nomem(new_ctx, ctx)) return;
        new_ctx->async.fn = continuation;
        new_ctx->async.private_data = private_data;
+
+       /* if we are setting up a continuation, and the context has
+          already finished, then we should run the callback with an
+          immediate event, otherwise we can be stuck forever */
+       if (new_ctx->state >= COMPOSITE_STATE_DONE && continuation) {
+               event_add_timed(new_ctx->event_ctx, new_ctx, timeval_zero(), composite_trigger, new_ctx);
+       }
 }
 
 _PUBLIC_ void composite_continue_rpc(struct composite_context *ctx,