It's defined like this in http_core.h: 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; Created in core_pre_connection() and passed to the core input/output filters, the ->client_socket is the same as the conn_config_t's (which the core filters could use instead), the ->c is unused, and the ->in/out_ctx fields are opaque and initialized by the core filters themselves. So could/should we remove this struct like the attached patch does (trunk only, plus MMN major)? Regards; Yann.
Index: include/http_core.h =================================================================== --- include/http_core.h (revision 1884381) +++ include/http_core.h (working copy) @@ -795,20 +795,6 @@ apr_status_t ap_core_output_filter(ap_filter_t *f, 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; - /** * Insert the network bucket into the core input filter's input brigade. * This hook is intended for MPMs or protocol modules that need to do special Index: server/core.c =================================================================== --- server/core.c (revision 1884381) +++ server/core.c (working copy) @@ -5508,15 +5508,14 @@ static conn_rec *core_create_conn(apr_pool_t *ptra static int core_pre_connection(conn_rec *c, void *csd) { - core_net_rec *net; conn_config_t *conn_config; apr_status_t rv; + /* only the master connection talks to the network */ if (c->master) { return DONE; } - - net = apr_palloc(c->pool, sizeof(*net)); + /* The Nagle algorithm says that we should delay sending partial * packets in hopes of getting more data. We don't want to do * this; we are not telnet. There are bad interactions between @@ -5546,22 +5545,13 @@ static int core_pre_connection(conn_rec *c, void * "apr_socket_timeout_set"); } - net->c = c; - net->in_ctx = NULL; - net->out_ctx = NULL; - net->client_socket = csd; - - conn_config = apr_palloc(c->pool, sizeof(conn_config)); + conn_config = apr_pcalloc(c->pool, sizeof(*conn_config)); conn_config->socket = csd; - ap_set_core_module_config(net->c->conn_config, conn_config); + ap_set_core_module_config(c->conn_config, conn_config); - /* only the master connection talks to the network */ - if (c->master == NULL) { - ap_add_input_filter_handle(ap_core_input_filter_handle, net, NULL, - net->c); - ap_add_output_filter_handle(ap_core_output_filter_handle, net, NULL, - net->c); - } + ap_add_input_filter_handle(ap_core_input_filter_handle, NULL, NULL, c); + ap_add_output_filter_handle(ap_core_output_filter_handle, NULL, NULL, c); + return DONE; } Index: server/core_filters.c =================================================================== --- server/core_filters.c (revision 1884381) +++ server/core_filters.c (working copy) @@ -78,17 +78,17 @@ do { \ #undef APLOG_MODULE_INDEX #define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX -struct core_output_filter_ctx { +typedef struct { apr_bucket_brigade *empty_bb; apr_size_t bytes_written; struct iovec *vec; apr_size_t nvec; -}; +} core_output_ctx_t; -struct core_filter_ctx { +typedef struct { apr_bucket_brigade *bb; apr_bucket_brigade *tmpbb; -}; +} core_input_ctx_t; apr_status_t ap_core_input_filter(ap_filter_t *f, apr_bucket_brigade *b, @@ -95,9 +95,10 @@ apr_status_t ap_core_input_filter(ap_filter_t *f, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes) { + conn_rec *c = f->c; + core_input_ctx_t *ctx = f->ctx; + conn_config_t *conf = ap_get_core_module_config(c->conn_config); apr_status_t rv = APR_SUCCESS; - core_net_rec *net = f->ctx; - core_ctx_t *ctx = net->in_ctx; const char *str; apr_size_t len; @@ -117,11 +118,11 @@ apr_status_t ap_core_input_filter(ap_filter_t *f, if (!ctx) { - net->in_ctx = ctx = apr_palloc(f->c->pool, sizeof(*ctx)); - ctx->bb = apr_brigade_create(f->c->pool, f->c->bucket_alloc); - ctx->tmpbb = apr_brigade_create(f->c->pool, f->c->bucket_alloc); + f->ctx = ctx = apr_palloc(c->pool, sizeof(*ctx)); + ctx->bb = apr_brigade_create(c->pool, c->bucket_alloc); + ctx->tmpbb = apr_brigade_create(c->pool, c->bucket_alloc); /* seed the brigade with the client socket. */ - rv = ap_run_insert_network_bucket(f->c, ctx->bb, net->client_socket); + rv = ap_run_insert_network_bucket(c, ctx->bb, conf->socket); if (rv != APR_SUCCESS) return rv; } @@ -163,7 +164,7 @@ apr_status_t ap_core_input_filter(ap_filter_t *f, * this mode. Determine whether anyone actually uses this or not. */ if (mode == AP_MODE_EATCRLF) { apr_bucket *e; - const char *c; + const char *ch; /* The purpose of this loop is to ignore any CRLF (or LF) at the end * of a request. Many browsers send extra lines at the end of POST @@ -186,12 +187,12 @@ apr_status_t ap_core_input_filter(ap_filter_t *f, goto cleanup; } - c = str; - while (c < str + len) { - if (*c == APR_ASCII_LF) - c++; - else if (*c == APR_ASCII_CR && *(c + 1) == APR_ASCII_LF) - c += 2; + ch = str; + while (ch < str + len) { + if (*ch == APR_ASCII_LF) + ch++; + else if (*ch == APR_ASCII_CR && *(ch + 1) == APR_ASCII_LF) + ch += 2; else goto cleanup; } @@ -227,7 +228,7 @@ apr_status_t ap_core_input_filter(ap_filter_t *f, * so tack on an EOS too. */ /* We have read until the brigade was empty, so we know that we * must be EOS. */ - e = apr_bucket_eos_create(f->c->bucket_alloc); + e = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(b, e); rv = APR_SUCCESS; @@ -262,7 +263,7 @@ apr_status_t ap_core_input_filter(ap_filter_t *f, apr_bucket_delete(e); if (mode == AP_MODE_READBYTES) { - e = apr_bucket_eos_create(f->c->bucket_alloc); + e = apr_bucket_eos_create(c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(b, e); } goto cleanup; @@ -340,12 +341,12 @@ cleanup: static apr_status_t send_brigade_nonblocking(apr_socket_t *s, apr_bucket_brigade *bb, - core_output_filter_ctx_t *ctx, + core_output_ctx_t *ctx, conn_rec *c); static apr_status_t writev_nonblocking(apr_socket_t *s, apr_bucket_brigade *bb, - core_output_filter_ctx_t *ctx, + core_output_ctx_t *ctx, apr_size_t bytes_to_write, apr_size_t nvec, conn_rec *c); @@ -353,7 +354,7 @@ static apr_status_t writev_nonblocking(apr_socket_ #if APR_HAS_SENDFILE static apr_status_t sendfile_nonblocking(apr_socket_t *s, apr_bucket *bucket, - core_output_filter_ctx_t *ctx, + core_output_ctx_t *ctx, conn_rec *c); #endif @@ -365,9 +366,9 @@ extern APR_OPTIONAL_FN_TYPE(ap_logio_add_bytes_out apr_status_t ap_core_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) { conn_rec *c = f->c; - core_net_rec *net = f->ctx; - apr_socket_t *sock = net->client_socket; - core_output_filter_ctx_t *ctx = net->out_ctx; + core_output_ctx_t *ctx = f->ctx; + conn_config_t *conf = ap_get_core_module_config(c->conn_config); + apr_socket_t *sock = conf->socket; apr_interval_time_t sock_timeout = 0; apr_status_t rv; @@ -378,8 +379,7 @@ apr_status_t ap_core_output_filter(ap_filter_t *f, } if (ctx == NULL) { - ctx = apr_pcalloc(c->pool, sizeof(*ctx)); - net->out_ctx = (core_output_filter_ctx_t *)ctx; + f->ctx = ctx = apr_pcalloc(c->pool, sizeof(*ctx)); } /* remain compatible with legacy MPMs that passed NULL to this filter */ @@ -490,11 +490,11 @@ static APR_INLINE int can_sendfile_bucket(apr_buck static apr_status_t send_brigade_nonblocking(apr_socket_t *s, apr_bucket_brigade *bb, - core_output_filter_ctx_t *ctx, + core_output_ctx_t *ctx, conn_rec *c) { apr_status_t rv = APR_SUCCESS; - core_server_config *conf = + core_server_config *sconf = ap_get_core_module_config(c->base_server->module_config); apr_size_t nvec = 0, nbytes = 0; apr_bucket *bucket, *next; @@ -610,7 +610,7 @@ static apr_status_t send_brigade_nonblocking(apr_s * we are at the end of the brigade, the write will happen outside * the loop anyway). */ - if (nbytes > conf->flush_max_threshold + if (nbytes > sconf->flush_max_threshold && next != APR_BRIGADE_SENTINEL(bb) && !is_in_memory_bucket(next)) { (void)apr_socket_opt_set(s, APR_TCP_NOPUSH, 1); @@ -633,7 +633,7 @@ cleanup: static apr_status_t writev_nonblocking(apr_socket_t *s, apr_bucket_brigade *bb, - core_output_filter_ctx_t *ctx, + core_output_ctx_t *ctx, apr_size_t bytes_to_write, apr_size_t nvec, conn_rec *c) @@ -693,7 +693,7 @@ static apr_status_t writev_nonblocking(apr_socket_ static apr_status_t sendfile_nonblocking(apr_socket_t *s, apr_bucket *bucket, - core_output_filter_ctx_t *ctx, + core_output_ctx_t *ctx, conn_rec *c) { apr_status_t rv;