#include "mod_core.h"
#include "apr_optional.h"
+#include "ap_mpm.h"
#if (MODULE_MAGIC_NUMBER_MAJOR > 20020903)
#include "mod_ssl.h"
return NULL;
}
+static void init_conn_pool(apr_pool_t *p, proxy_worker *worker)
+{
+ apr_pool_t *pool;
+ proxy_conn_pool *cp;
+
+ /* Create a connection pool's subpool */
+ apr_pool_create(&pool, p);
+ cp = (proxy_conn_pool *)apr_pcalloc(pool, sizeof(proxy_conn_pool));
+ cp->pool = pool;
+#if APR_HAS_THREADS
+ {
+ int mpm_threads;
+ ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads);
+ if (mpm_threads > 1) {
+ /* Set hard max to no more then mpm_threads */
+ if (worker->hmax == 0 || worker->hmax > mpm_threads)
+ worker->hmax = mpm_threads;
+ if (worker->smax == 0 || worker->smax > worker->hmax)
+ worker->smax = worker->hmax;
+ /* Set min to be lower then smax */
+ if (worker->min > worker->smax)
+ worker->min = worker->smax;
+ }
+ else {
+ /* This will supress the apr_reslist creation */
+ worker->min = worker->smax = worker->hmax = 0;
+ }
+ }
+#endif
+
+ worker->cp = cp;
+}
+
PROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker,
apr_pool_t *p,
proxy_server_conf *conf,
port = apr_uri_port_of_scheme((*worker)->scheme);
(*worker)->port = port;
+ init_conn_pool(p, *worker);
+
return NULL;
}
typedef struct {
apr_pool_t *pool; /* The pool used in constructor and destructor calls */
apr_sockaddr_t *addr; /* Preparsed remote address info */
- int min; /* Desired minimum number of available connections */
- int smax; /* Soft maximum on the total number of connections */
- int hmax; /* Hard maximum on the total number of connections */
#if APR_HAS_THREADS
apr_reslist_t *res; /* Connection resource list */
#else
const char *scheme; /* scheme to use ajp|http|https */
const char *hostname; /* remote backend address */
apr_port_t port;
+ int min; /* Desired minimum number of available connections */
+ int smax; /* Soft maximum on the total number of connections */
+ int hmax; /* Hard maximum on the total number of connections */
proxy_conn_pool *cp; /* Connection pool to use */
void *opaque; /* per scheme worker data */
} proxy_worker;