static void
ngx_http_push_stream_exit_worker(ngx_cycle_t *cycle)
{
    if (!ngx_http_push_stream_enabled) {
        return;
    }

    if ((ngx_process != NGX_PROCESS_SINGLE) && (ngx_process != NGX_PROCESS_WORKER)) {
        return;
    }

    ngx_http_push_stream_cleanup_shutting_down_worker();

    ngx_http_push_stream_ipc_exit_worker(cycle);
}
static void
ngx_http_push_stream_exit_worker(ngx_cycle_t *cycle)
{
    // disconnect all subscribers (force_disconnect = 1)
    ngx_http_push_stream_disconnect_worker_subscribers(1);

    if (ngx_http_push_stream_ping_event.timer_set) {
        ngx_del_timer(&ngx_http_push_stream_ping_event);
    }

    if (ngx_http_push_stream_disconnect_event.timer_set) {
        ngx_del_timer(&ngx_http_push_stream_disconnect_event);
    }

    if (ngx_http_push_stream_memory_cleanup_event.timer_set) {
        ngx_del_timer(&ngx_http_push_stream_memory_cleanup_event);
    }

    ngx_http_push_stream_ipc_exit_worker(cycle);
}
static void
ngx_http_push_stream_exit_worker(ngx_cycle_t *cycle)
{
    if ((ngx_http_push_stream_module_main_conf == NULL) || !ngx_http_push_stream_module_main_conf->enabled) {
        return;
    }

    if ((ngx_process != NGX_PROCESS_SINGLE) && (ngx_process != NGX_PROCESS_WORKER)) {
        return;
    }

    ngx_http_push_stream_clean_worker_data();

    if (ngx_http_push_stream_memory_cleanup_event.timer_set) {
        ngx_del_timer(&ngx_http_push_stream_memory_cleanup_event);
    }

    if (ngx_http_push_stream_buffer_cleanup_event.timer_set) {
        ngx_del_timer(&ngx_http_push_stream_buffer_cleanup_event);
    }

    ngx_http_push_stream_ipc_exit_worker(cycle);
}