static void proxy_wstunnel_callback(void *b) { 
    int status;
    apr_socket_t *sockets[3] = {NULL, NULL, NULL};
    ws_baton_t *baton = (ws_baton_t*)b;
    proxyws_dir_conf *dconf = ap_get_module_config(baton->r->per_dir_config, &proxy_wstunnel_module);
    apr_pool_clear(baton->subpool);
    status = proxy_wstunnel_pump(baton, dconf->async_delay, dconf->is_async);
    if (status == SUSPENDED) {
        sockets[0] = baton->client_soc;
        sockets[1] = baton->server_soc;
        ap_mpm_register_socket_callback_timeout(sockets, baton->subpool, 1, 
            proxy_wstunnel_callback, 
            proxy_wstunnel_cancel_callback, 
            baton, 
            dconf->idle_timeout);
        ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, baton->r, "proxy_wstunnel_callback suspend");
    }
    else { 
        proxy_wstunnel_finish(baton);
    }
}