* mpm_unregister_poll_callback hook.
* 20200702.0 (2.5.1-dev) Add pool arg to mpm_register_poll_callback and
* mpm_register_poll_callback_timeout hooks
- *
*/
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
*/
AP_DECLARE(apr_status_t) ap_mpm_register_poll_callback(
- apr_pool_t *p, apr_array_header_t *pfds,
+ apr_pool_t *p, const apr_array_header_t *pfds,
ap_mpm_callback_fn_t *cbfn, void *baton);
/**
*/
AP_DECLARE(apr_status_t) ap_mpm_register_poll_callback_timeout(
- apr_pool_t *p, apr_array_header_t *pfds,
+ apr_pool_t *p, const apr_array_header_t *pfds,
ap_mpm_callback_fn_t *cbfn, ap_mpm_callback_fn_t *tofn,
void *baton, apr_time_t timeout);
* @ingroup hooks
*/
AP_DECLARE_HOOK(apr_status_t, mpm_register_poll_callback,
- (apr_pool_t *p, apr_array_header_t *pds,
+ (apr_pool_t *p, const apr_array_header_t *pds,
ap_mpm_callback_fn_t *cbfn, void *baton))
/* register the specified callback, with timeout
*
*/
AP_DECLARE_HOOK(apr_status_t, mpm_register_poll_callback_timeout,
- (apr_pool_t *p, apr_array_header_t *pds,
- ap_mpm_callback_fn_t *cbfn,
- ap_mpm_callback_fn_t *tofn,
+ (apr_pool_t *p, const apr_array_header_t *pds,
+ ap_mpm_callback_fn_t *cbfn, ap_mpm_callback_fn_t *tofn,
void *baton, apr_time_t timeout))
/** Resume the suspended connection
proxy_tunnel_rec *tunnel;
apr_pool_t *async_pool;
- apr_array_header_t *pfds;
apr_interval_time_t idle_timeout;
unsigned int can_go_async :1,
/* Pump both ends until they'd block and then start over again */
status = ap_proxy_tunnel_run(req->tunnel);
if (status == HTTP_GATEWAY_TIME_OUT) {
- if (!req->async_pool) {
- /* Create the MPM's (req->)pfds off of our tunnel's, and
- * the subpool used by the MPM to alloc its own temporary
- * data, which we want to clear on the next round (above)
- * to avoid leaks.
- */
- req->pfds = apr_array_copy(req->p, req->tunnel->pfds);
- APR_ARRAY_IDX(req->pfds, 0, apr_pollfd_t).client_data = NULL;
- APR_ARRAY_IDX(req->pfds, 1, apr_pollfd_t).client_data = NULL;
- apr_pool_create(&req->async_pool, req->p);
- }
- else {
- /* Update only reqevents of the MPM's pfds with our tunnel's,
- * the rest didn't change.
- */
- APR_ARRAY_IDX(req->pfds, 0, apr_pollfd_t).reqevents =
- APR_ARRAY_IDX(req->tunnel->pfds, 0, apr_pollfd_t).reqevents;
- APR_ARRAY_IDX(req->pfds, 1, apr_pollfd_t).reqevents =
- APR_ARRAY_IDX(req->tunnel->pfds, 1, apr_pollfd_t).reqevents;
- }
status = SUSPENDED;
}
break;
"proxy %s: suspended, going async",
req->proto);
- ap_mpm_register_poll_callback_timeout(req->async_pool, req->pfds,
+ if (!req->async_pool) {
+ /* Create the subpool used by the MPM to alloc its own
+ * temporary data, which we want to clear on the next
+ * round (above) to avoid leaks.
+ */
+ apr_pool_create(&req->async_pool, req->p);
+ }
+
+ ap_mpm_register_poll_callback_timeout(req->async_pool,
+ req->tunnel->pfds,
proxy_http_async_cb,
proxy_http_async_cancel_cb,
req, req->idle_timeout);
request_rec *r;
proxy_conn_rec *backend;
proxy_tunnel_rec *tunnel;
- apr_array_header_t *pfds;
apr_pool_t *async_pool;
const char *scheme;
} ws_baton_t;
ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, baton->r,
"proxy_wstunnel_callback suspend");
- /* Update only reqevents of the MPM's pfds with our tunnel's,
- * the rest didn't change.
- */
- APR_ARRAY_IDX(baton->pfds, 0, apr_pollfd_t).reqevents =
- APR_ARRAY_IDX(baton->tunnel->pfds, 0, apr_pollfd_t).reqevents;
- APR_ARRAY_IDX(baton->pfds, 1, apr_pollfd_t).reqevents =
- APR_ARRAY_IDX(baton->tunnel->pfds, 1, apr_pollfd_t).reqevents;
-
- ap_mpm_register_poll_callback_timeout(baton->async_pool, baton->pfds,
+ ap_mpm_register_poll_callback_timeout(baton->async_pool,
+ baton->tunnel->pfds,
proxy_wstunnel_callback,
proxy_wstunnel_cancel_callback,
baton, dconf->idle_timeout);
tunnel->timeout = dconf->async_delay;
status = proxy_wstunnel_pump(baton, 1);
if (status == SUSPENDED) {
- /* Create the MPM's (baton->)pfds off of our tunnel's, and
- * the subpool used by the MPM to alloc its own temporary
- * data, which we want to clear on the next round (above)
- * to avoid leaks.
+ /* Create the subpool used by the MPM to alloc its own
+ * temporary data, which we want to clear on the next
+ * round (above) to avoid leaks.
*/
- baton->pfds = apr_array_copy(baton->r->pool, baton->tunnel->pfds);
- APR_ARRAY_IDX(baton->pfds, 0, apr_pollfd_t).client_data = NULL;
- APR_ARRAY_IDX(baton->pfds, 1, apr_pollfd_t).client_data = NULL;
apr_pool_create(&baton->async_pool, baton->r->pool);
rv = ap_mpm_register_poll_callback_timeout(
- baton->async_pool, baton->pfds,
+ baton->async_pool,
+ baton->tunnel->pfds,
proxy_wstunnel_callback,
proxy_wstunnel_cancel_callback,
baton,
}
static apr_status_t event_register_poll_callback_ex(apr_pool_t *p,
- apr_array_header_t *pfds,
- ap_mpm_callback_fn_t *cbfn,
- ap_mpm_callback_fn_t *tofn,
- void *baton,
- apr_time_t timeout)
+ const apr_array_header_t *pfds,
+ ap_mpm_callback_fn_t *cbfn,
+ ap_mpm_callback_fn_t *tofn,
+ void *baton,
+ apr_time_t timeout)
{
socket_callback_baton_t *scb = apr_pcalloc(p, sizeof(*scb));
listener_poll_type *pt = apr_palloc(p, sizeof(*pt));
scb->cbfunc = cbfn;
scb->user_baton = baton;
- scb->pfds = pfds;
+ scb->pfds = apr_array_copy(p, pfds);
- apr_pool_pre_cleanup_register(p, pfds, event_cleanup_poll_callback);
+ apr_pool_pre_cleanup_register(p, scb->pfds, event_cleanup_poll_callback);
- for (i = 0; i < pfds->nelts; i++) {
- apr_pollfd_t *pfd = (apr_pollfd_t *)pfds->elts + i;
+ for (i = 0; i < scb->pfds->nelts; i++) {
+ apr_pollfd_t *pfd = (apr_pollfd_t *)scb->pfds->elts + i;
if (pfd->reqevents) {
if (pfd->reqevents & APR_POLLIN) {
pfd->reqevents |= APR_POLLHUP;
if (timeout > 0) {
/* XXX: This cancel timer event can fire before the pollset is updated */
- scb->cancel_event = event_get_timer_event(timeout, tofn, baton, 1, pfds);
+ scb->cancel_event = event_get_timer_event(timeout, tofn, baton, 1, scb->pfds);
}
- for (i = 0; i < pfds->nelts; i++) {
- apr_pollfd_t *pfd = (apr_pollfd_t *)pfds->elts + i;
+ for (i = 0; i < scb->pfds->nelts; i++) {
+ apr_pollfd_t *pfd = (apr_pollfd_t *)scb->pfds->elts + i;
if (pfd->client_data) {
rc = apr_pollset_add(event_pollset, pfd);
if (rc != APR_SUCCESS) {
}
static apr_status_t event_register_poll_callback(apr_pool_t *p,
- apr_array_header_t *pfds,
+ const apr_array_header_t *pfds,
ap_mpm_callback_fn_t *cbfn,
void *baton)
{
(conn_rec *c),
(c), APR_ENOTIMPL)
AP_IMPLEMENT_HOOK_RUN_FIRST(apr_status_t, mpm_register_poll_callback,
- (apr_pool_t *p, apr_array_header_t *pds,
+ (apr_pool_t *p, const apr_array_header_t *pds,
ap_mpm_callback_fn_t *cbfn, void *baton),
(p, pds, cbfn, baton), APR_ENOTIMPL)
AP_IMPLEMENT_HOOK_RUN_FIRST(apr_status_t, mpm_register_poll_callback_timeout,
- (apr_pool_t *p, apr_array_header_t *pds,
+ (apr_pool_t *p, const apr_array_header_t *pds,
ap_mpm_callback_fn_t *cbfn,
ap_mpm_callback_fn_t *tofn,
void *baton, apr_time_t timeout),
}
AP_DECLARE(apr_status_t) ap_mpm_register_poll_callback(
- apr_pool_t *p, apr_array_header_t *pfds,
+ apr_pool_t *p, const apr_array_header_t *pfds,
ap_mpm_callback_fn_t *cbfn, void *baton)
{
return ap_run_mpm_register_poll_callback(p, pfds, cbfn, baton);
}
AP_DECLARE(apr_status_t) ap_mpm_register_poll_callback_timeout(
- apr_pool_t *p, apr_array_header_t *pfds, ap_mpm_callback_fn_t *cbfn,
- ap_mpm_callback_fn_t *tofn, void *baton, apr_time_t timeout)
+ apr_pool_t *p, const apr_array_header_t *pfds,
+ ap_mpm_callback_fn_t *cbfn, ap_mpm_callback_fn_t *tofn,
+ void *baton, apr_time_t timeout)
{
return ap_run_mpm_register_poll_callback_timeout(p, pfds, cbfn, tofn,
baton, timeout);