else if (!strcasecmp(key, "ttl")) {
ival = atoi(val);
if (ival < 1)
- return "ttl must be al least one second";
+ return "ttl must be at least one second";
worker->ttl = apr_time_from_sec(ival);
}
else if (!strcasecmp(key, "min")) {
return "smax must be a positive number";
worker->smax = ival;
}
+ else if (!strcasecmp(key, "acquire")) {
+ ival = atoi(val);
+ if (ival < 1)
+ return "acquire must be at least one mili second";
+ worker->acquire = apr_time_make(0, ival * 1000);
+ worker->acquire_set = 1;
+ }
else {
return "unknown parameter";
}
apr_interval_time_t ttl; /* maximum amount of time in seconds a connection
* may be available while exceeding the soft limit */
apr_interval_time_t timeout; /* connection timeout */
-
+ apr_interval_time_t acquire; /* acquire timeout when the maximum number of connections is exceeded */
+ char acquire_set;
proxy_conn_pool *cp; /* Connection pool to use */
void *opaque; /* per scheme worker data */
};
return APR_SUCCESS;
}
+/* low level connection acquire/release functions
+ * they are hiding apr_reslist for nothreaded or prefork servers.
+ */
+static apr_status_t acquire_connection_low(proxy_conn_rec **conn, proxy_worker *worker)
+{
+ apr_status_t rv;
+#if APR_HAS_THREADS
+ if (worker->hmax) {
+ rv = apr_reslist_acquire(worker->cp->res, (void **)conn);
+ }
+ else
+#endif
+ {
+ *conn = worker->cp->conn;
+ rv = APR_SUCCESS;
+ }
+ return rv;
+}
+
+static apr_status_t release_connection_low(proxy_conn_rec *conn, proxy_worker *worker)
+{
+ apr_status_t rv = APR_SUCCESS;
+#if APR_HAS_THREADS
+ if (worker->hmax) {
+ rv = apr_reslist_release(worker->cp->res, (void *)conn);
+ }
+#endif
+ return rv;
+}
+
+
static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s)
{
apr_status_t rv;
worker->hmax, worker->ttl,
connection_constructor, connection_destructor,
s, worker->cp->pool);
+#if (APR_MAJOR_VERSION > 0)
+ /* Set the acquire timeout */
+ if (rv == APR_SUCCESS && worker->acquire_set)
+ apr_reslist_timeout_set(worker->cp->res, worker->acquire);
+#endif
}
else
#endif