static int start_lingering_close_blocking(event_conn_state_t *cs)
{
    apr_socket_t *csd = cs->pfd.desc.s;

    if (ap_start_lingering_close(cs->c)) {
        notify_suspend(cs);
        apr_socket_close(csd);
        ap_queue_info_push_pool(worker_queue_info, cs->p);
        return DONE;
    }

#ifdef AP_DEBUG
    {
        apr_status_t rv;
        rv = apr_socket_timeout_set(csd, 0);
        AP_DEBUG_ASSERT(rv == APR_SUCCESS);
    }
#else
    apr_socket_timeout_set(csd, 0);
#endif

    cs->queue_timestamp = apr_time_now();
    /*
     * If some module requested a shortened waiting period, only wait for
     * 2s (SECONDS_TO_LINGER). This is useful for mitigating certain
     * DoS attacks.
     */
    if (apr_table_get(cs->c->notes, "short-lingering-close")) {
        cs->pub.state = CONN_STATE_LINGER_SHORT;
    }
    else {
        cs->pub.state = CONN_STATE_LINGER_NORMAL;
    }
    apr_atomic_inc32(&lingering_count);
    notify_suspend(cs);

    return OK;
}