void h2_config_init(apr_pool_t *pool) { /* Determine a good default for this platform and mpm? * TODO: not sure how APR wants to hand out this piece of * information. */ int max_files = 256; int conn_threads = 1; int tx_files = max_files / 4; (void)pool; ap_mpm_query(AP_MPMQ_MAX_THREADS, &conn_threads); switch (h2_conn_mpm_type()) { case H2_MPM_PREFORK: case H2_MPM_WORKER: case H2_MPM_EVENT: /* allow that many transfer open files per mplx */ files_per_session = (tx_files / conn_threads); break; default: /* don't know anything about it, stay safe */ break; } }
conn_rec *h2_slave_create(conn_rec *master, apr_pool_t *p, apr_thread_t *thread, apr_socket_t *socket) { conn_rec *c; AP_DEBUG_ASSERT(master); ap_log_cerror(APLOG_MARK, APLOG_TRACE3, 0, master, "h2_conn(%ld): created from master", master->id); /* This is like the slave connection creation from 2.5-DEV. A * very efficient way - not sure how compatible this is, since * the core hooks are no longer run. * But maybe it's is better this way, not sure yet. */ c = (conn_rec *) apr_palloc(p, sizeof(conn_rec)); if (c == NULL) { ap_log_cerror(APLOG_MARK, APLOG_ERR, APR_ENOMEM, master, APLOGNO(02913) "h2_task: creating conn"); return NULL; } memcpy(c, master, sizeof(conn_rec)); /* Replace these */ c->id = (master->id & (long)p); c->master = master; c->pool = p; c->current_thread = thread; c->conn_config = ap_create_conn_config(p); c->notes = apr_table_make(p, 5); c->input_filters = NULL; c->output_filters = NULL; c->bucket_alloc = apr_bucket_alloc_create(p); c->cs = NULL; c->data_in_input_filters = 0; c->data_in_output_filters = 0; c->clogging_input_filters = 1; c->log = NULL; c->log_id = NULL; /* TODO: these should be unique to this thread */ c->sbh = master->sbh; /* Simulate that we had already a request on this connection. */ c->keepalives = 1; ap_set_module_config(c->conn_config, &core_module, socket); /* This works for mpm_worker so far. Other mpm modules have * different needs, unfortunately. The most interesting one * being mpm_event... */ switch (h2_conn_mpm_type()) { case H2_MPM_WORKER: /* all fine */ break; case H2_MPM_EVENT: fix_event_conn(c, master); break; default: /* fingers crossed */ break; } return c; }