Author: rhuijben Date: Wed Nov 4 19:51:54 2015 New Revision: 1712621 URL: http://svn.apache.org/viewvc?rev=1712621&view=rev Log: In preparation for really fixing the root cause revert the ostream_tail creation to use a normal aggregate stream which does destroy the buckets added to it when done. This partially reverts r1698925.
[The fix was really already implemented years ago when the writing_started flag was added] This adds a lot more flexibility to the buckets added as they get a callback when done (it even fixes a memoryleak in the http2 code where I didn't expect this behavior). Temporarily just introduce a barrier bucket around the request to allow separating the behavior change over multiple commits. * buckets/aggregate_buckets.c (aggregate_context_t): Remove flag. (cleanup_aggregate, create_aggregate): Update usage. (serf__bucket_stream_create): Remove function. (serf_aggregate_destroy_and_data): Update usage. * outgoing.c (do_conn_setup): Update creation. (write_to_connection): Create barrier. * serf_bucket_types.h (serf__bucket_stream_create): Remove private function. * ssltunnel.c (serf__ssltunnel_connect): Update creation. Modified: serf/trunk/buckets/aggregate_buckets.c serf/trunk/outgoing.c serf/trunk/serf_bucket_types.h serf/trunk/ssltunnel.c Modified: serf/trunk/buckets/aggregate_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/aggregate_buckets.c?rev=1712621&r1=1712620&r2=1712621&view=diff ============================================================================== --- serf/trunk/buckets/aggregate_buckets.c (original) +++ serf/trunk/buckets/aggregate_buckets.c Wed Nov 4 19:51:54 2015 @@ -36,9 +36,6 @@ typedef struct aggregate_context_t { serf_bucket_aggregate_eof_t hold_open; void *hold_open_baton; - /* Does this bucket own its children? !0 if yes, 0 if not. */ - int bucket_owner; - serf_config_t *config; } aggregate_context_t; @@ -54,9 +51,7 @@ static void cleanup_aggregate(aggregate_ while (ctx->done != NULL) { next_list = ctx->done->next; - if (ctx->bucket_owner) { - serf_bucket_destroy(ctx->done->bucket); - } + serf_bucket_destroy(ctx->done->bucket); serf_bucket_mem_free(allocator, ctx->done); ctx->done = next_list; @@ -83,7 +78,6 @@ static aggregate_context_t *create_aggre ctx->hold_open = NULL; ctx->hold_open_baton = NULL; ctx->config = NULL; - ctx->bucket_owner = 1; return ctx; } @@ -98,21 +92,6 @@ serf_bucket_t *serf_bucket_aggregate_cre return serf_bucket_create(&serf_bucket_type_aggregate, allocator, ctx); } -serf_bucket_t *serf__bucket_stream_create( - serf_bucket_alloc_t *allocator, - serf_bucket_aggregate_eof_t fn, - void *baton) -{ - serf_bucket_t *bucket = serf_bucket_aggregate_create(allocator); - aggregate_context_t *ctx = bucket->data; - - serf_bucket_aggregate_hold_open(bucket, fn, baton); - - ctx->bucket_owner = 0; - - return bucket; -} - static void serf_aggregate_destroy_and_data(serf_bucket_t *bucket) { @@ -120,9 +99,7 @@ static void serf_aggregate_destroy_and_d bucket_list_t *next_ctx; while (ctx->list) { - if (ctx->bucket_owner) { - serf_bucket_destroy(ctx->list->bucket); - } + serf_bucket_destroy(ctx->list->bucket); next_ctx = ctx->list->next; serf_bucket_mem_free(bucket->allocator, ctx->list); ctx->list = next_ctx; Modified: serf/trunk/outgoing.c URL: http://svn.apache.org/viewvc/serf/trunk/outgoing.c?rev=1712621&r1=1712620&r2=1712621&view=diff ============================================================================== --- serf/trunk/outgoing.c (original) +++ serf/trunk/outgoing.c Wed Nov 4 19:51:54 2015 @@ -249,9 +249,9 @@ static apr_status_t do_conn_setup(serf_c } if (conn->ostream_tail == NULL) { - conn->ostream_tail = serf__bucket_stream_create(conn->allocator, - detect_eof, - conn); + conn->ostream_tail = serf_bucket_aggregate_create(conn->allocator); + + serf_bucket_aggregate_hold_open(conn->ostream_tail, detect_eof, conn); } ostream = conn->ostream_tail; @@ -874,7 +874,10 @@ static apr_status_t write_to_connection( if (!request->writing_started) { request->writing_started = 1; - serf_bucket_aggregate_append(ostreamt, request->req_bkt); + serf_bucket_aggregate_append( + ostreamt, + serf_bucket_barrier_create(request->req_bkt, + request->allocator)); } } Modified: serf/trunk/serf_bucket_types.h URL: http://svn.apache.org/viewvc/serf/trunk/serf_bucket_types.h?rev=1712621&r1=1712620&r2=1712621&view=diff ============================================================================== --- serf/trunk/serf_bucket_types.h (original) +++ serf/trunk/serf_bucket_types.h Wed Nov 4 19:51:54 2015 @@ -224,21 +224,6 @@ void serf_bucket_aggregate_cleanup( serf_bucket_t *serf_bucket_aggregate_create( serf_bucket_alloc_t *allocator); -/* Creates a stream bucket. - A stream bucket is like an aggregate bucket, but: - - it doesn't destroy its child buckets on cleanup - - one can always keep adding child buckets, the handler FN should return - APR_EOF when no more buckets will be added. - - Note: keep this factory function internal for now. If it turns out this - bucket type is useful outside serf, we should make it an actual separate - type. - */ -serf_bucket_t *serf__bucket_stream_create( - serf_bucket_alloc_t *allocator, - serf_bucket_aggregate_eof_t fn, - void *baton); - /** Transform @a bucket in-place into an aggregate bucket. * * It is callers responsibility to free resources held by the original Modified: serf/trunk/ssltunnel.c URL: http://svn.apache.org/viewvc/serf/trunk/ssltunnel.c?rev=1712621&r1=1712620&r2=1712621&view=diff ============================================================================== --- serf/trunk/ssltunnel.c (original) +++ serf/trunk/ssltunnel.c Wed Nov 4 19:51:54 2015 @@ -189,9 +189,8 @@ apr_status_t serf__ssltunnel_connect(ser ctx->uri = apr_psprintf(ctx->pool, "%s:%d", conn->host_info.hostname, conn->host_info.port); - conn->ssltunnel_ostream = serf__bucket_stream_create(conn->allocator, - detect_eof, - conn); + conn->ssltunnel_ostream = serf_bucket_aggregate_create(conn->allocator); + serf_bucket_aggregate_hold_open(conn->ssltunnel_ostream, detect_eof, conn); serf__ssltunnel_request_create(conn, setup_request,