From e499c6e683ee882a3c93d6007593180bf8d29351 Mon Sep 17 00:00:00 2001 From: Stefan Fritsch Date: Mon, 23 Jan 2012 21:58:42 +0000 Subject: [PATCH] Make the core input/output filter contexts private and provide accessor APIs for mpm_winnt and mod_ftp. This allows to add members to the context structs without breaking binary compatibility. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1235019 13f79535-47bb-0310-9956-ffa450edef68 --- include/ap_mmn.h | 6 +++++- include/http_core.h | 34 ++++++++++++++++++++++++++++++++++ include/httpd.h | 24 ------------------------ server/core_filters.c | 36 +++++++++++++++++++++++++++--------- server/mpm/winnt/child.c | 15 +++++---------- 5 files changed, 71 insertions(+), 44 deletions(-) diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 2f9e6bb0a6..0d4de5cc46 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -385,12 +385,16 @@ * 20111203.1 (2.5.0-dev) Add ap_list_provider_groups() * 20120109.0 (2.5.0-dev) Changes sizeof(overrides_t) in core config. * 20120111.0 (2.5.0-dev) Remove sb_type from global_score. + * 20120123.0 (2.5.0-dev) Make core_output_filter_ctx_t and core_ctx_t + * private, add ap_create_core_ctx(), + * ap_core_ctx_get_bb(), move core_net rec definition + * to http_core.h */ #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */ #ifndef MODULE_MAGIC_NUMBER_MAJOR -#define MODULE_MAGIC_NUMBER_MAJOR 20120111 +#define MODULE_MAGIC_NUMBER_MAJOR 20120123 #endif #define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */ diff --git a/include/http_core.h b/include/http_core.h index c4f4bacfa7..9332e2eaee 100644 --- a/include/http_core.h +++ b/include/http_core.h @@ -689,6 +689,40 @@ apr_status_t ap_core_output_filter(ap_filter_t *f, apr_bucket_brigade *b); AP_DECLARE(const char*) ap_get_server_protocol(server_rec* s); AP_DECLARE(void) ap_set_server_protocol(server_rec* s, const char* proto); +typedef struct core_output_filter_ctx core_output_filter_ctx_t; +typedef struct core_filter_ctx core_ctx_t; + +typedef struct core_net_rec { + /** Connection to the client */ + apr_socket_t *client_socket; + + /** connection record */ + conn_rec *c; + + core_output_filter_ctx_t *out_ctx; + core_ctx_t *in_ctx; +} core_net_rec; + +/** + * Allocate and fill the core_ctx_t for the core input filter, but don't + * create a bucket with the input socket. + * Normally this is done automatically when the core input filter is called + * for the first time, but MPMs or protocol modules that need to do special + * socket setup can call this function to do the initialization earlier. + * They must add the input socket bucket to the core input filter's bucket + * brigade, see ap_core_ctx_get_bb(). + * @param c The conn_rec of the connection + * @return The core_ctx_t to be stored in core_net_rec->in_ctx + */ +AP_DECLARE(core_ctx_t *) ap_create_core_ctx(conn_rec *c); + +/** + * Accessor for the core input filter's bucket brigade + * @param c The core_ctx_t to get the brigade from + * @return The bucket brigade + */ +AP_DECLARE(apr_bucket_brigade *) ap_core_ctx_get_bb(core_ctx_t *ctx); + /* ---------------------------------------------------------------------- * * Runtime status/management diff --git a/include/httpd.h b/include/httpd.h index 90bbc1043b..9fe782d9c9 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -1270,30 +1270,6 @@ struct server_rec { void *context; }; -typedef struct core_output_filter_ctx { - apr_bucket_brigade *buffered_bb; - apr_bucket_brigade *tmp_flush_bb; - apr_pool_t *deferred_write_pool; - apr_size_t bytes_in; - apr_size_t bytes_written; -} core_output_filter_ctx_t; - -typedef struct core_filter_ctx { - apr_bucket_brigade *b; - apr_bucket_brigade *tmpbb; -} core_ctx_t; - -typedef struct core_net_rec { - /** Connection to the client */ - apr_socket_t *client_socket; - - /** connection record */ - conn_rec *c; - - core_output_filter_ctx_t *out_ctx; - core_ctx_t *in_ctx; -} core_net_rec; - /** * Get the context_document_root for a request. This is a generalization of * the document root, which is too limited in the presence of mappers like diff --git a/server/core_filters.c b/server/core_filters.c index 42da5c279f..275ff42777 100644 --- a/server/core_filters.c +++ b/server/core_filters.c @@ -78,6 +78,32 @@ do { \ #undef APLOG_MODULE_INDEX #define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX +typedef struct core_output_filter_ctx { + apr_bucket_brigade *buffered_bb; + apr_bucket_brigade *tmp_flush_bb; + apr_pool_t *deferred_write_pool; + apr_size_t bytes_written; +} core_output_filter_ctx_t; + +typedef struct core_filter_ctx { + apr_bucket_brigade *b; + apr_bucket_brigade *tmpbb; +} core_ctx_t; + + +AP_DECLARE(core_ctx_t *) ap_create_core_ctx(conn_rec *c) +{ + core_ctx_t *ctx = apr_palloc(c->pool, sizeof(*ctx)); + ctx->b = apr_brigade_create(c->pool, c->bucket_alloc); + ctx->tmpbb = apr_brigade_create(c->pool, c->bucket_alloc); + return ctx; +} + +AP_DECLARE(apr_bucket_brigade *) ap_core_ctx_get_bb(core_ctx_t *ctx) +{ + return ctx->b; +} + int ap_core_input_filter(ap_filter_t *f, apr_bucket_brigade *b, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes) @@ -105,18 +131,10 @@ int ap_core_input_filter(ap_filter_t *f, apr_bucket_brigade *b, if (!ctx) { - /* - * Note that this code is never executed on Windows because the winnt - * MPM does the setup of net->in_ctx. - * XXX: This should be fixed. - */ - ctx = apr_pcalloc(f->c->pool, sizeof(*ctx)); - ctx->b = apr_brigade_create(f->c->pool, f->c->bucket_alloc); - ctx->tmpbb = apr_brigade_create(ctx->b->p, ctx->b->bucket_alloc); + net->in_ctx = ctx = ap_create_core_ctx(f->c); /* seed the brigade with the client socket. */ e = apr_bucket_socket_create(net->client_socket, f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(ctx->b, e); - net->in_ctx = ctx; } else if (APR_BRIGADE_EMPTY(ctx->b)) { return APR_EOF; diff --git a/server/mpm/winnt/child.c b/server/mpm/winnt/child.c index ab4fddc3e7..30a525a8a8 100644 --- a/server/mpm/winnt/child.c +++ b/server/mpm/winnt/child.c @@ -812,7 +812,6 @@ static DWORD __stdcall worker_main(void *thread_num_val) } else if (e) { - core_ctx_t *ctx; core_net_rec *net; ap_filter_t *filt; @@ -820,24 +819,20 @@ static DWORD __stdcall worker_main(void *thread_num_val) while ((strcmp(filt->frec->name, "core_in") != 0) && filt->next) filt = filt->next; net = filt->ctx; - ctx = net->in_ctx; - if (net->in_ctx) - ctx = net->in_ctx; - else + if (net->in_ctx == NULL) { - ctx = apr_pcalloc(c->pool, sizeof(*ctx)); - ctx->b = apr_brigade_create(c->pool, c->bucket_alloc); - ctx->tmpbb = apr_brigade_create(c->pool, c->bucket_alloc); + core_ctx_t *ctx = ap_create_core_ctx(c); + apr_bucket_brigade *bb = ap_core_ctx_get_bb(ctx); /* seed the brigade with AcceptEx read heap bucket */ e = context->overlapped.Pointer; - APR_BRIGADE_INSERT_HEAD(ctx->b, e); + APR_BRIGADE_INSERT_HEAD(bb, e); /* also seed the brigade with the client socket. */ e = apr_bucket_socket_create(net->client_socket, c->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(ctx->b, e); + APR_BRIGADE_INSERT_TAIL(bb, e); net->in_ctx = ctx; } } -- 2.40.0