diff --git a/lib/roles/cgi/cgi-server.c b/lib/roles/cgi/cgi-server.c index 0adf2c95d..60b956f0b 100644 --- a/lib/roles/cgi/cgi-server.c +++ b/lib/roles/cgi/cgi-server.c @@ -35,6 +35,9 @@ static const char *hex = "0123456789ABCDEF"; +void +lws_cgi_sul_cb(lws_sorted_usec_list_t *sul); + static int urlencode(const char *in, int inlen, char *out, int outlen) { @@ -145,6 +148,11 @@ lws_cgi(struct lws *wsi, const char * const *exec_array, cgi->cgi_list = pt->http.cgi_list; pt->http.cgi_list = cgi; + /* if it's not already running, start the cleanup timer */ + if (!pt->sul_cgi.list.owner) + lws_sul_schedule(pt->context, (int)(pt - pt->context->pt), &pt->sul_cgi, + lws_cgi_sul_cb, 3 * LWS_US_PER_SEC); + sum += lws_snprintf(sum, lws_ptr_diff_size_t(sumend, sum), "%s ", exec_array[0]); if (0) { @@ -1095,4 +1103,7 @@ lws_cgi_remove_and_kill(struct lws *wsi) /* we have a cgi going, we must kill it */ wsi->http.cgi->being_closed = 1; lws_cgi_kill(wsi); + + if (!pt->http.cgi_list) + lws_sul_cancel(&pt->sul_cgi); } diff --git a/lib/roles/cgi/ops-cgi.c b/lib/roles/cgi/ops-cgi.c index 346de4f4e..1b1c00145 100644 --- a/lib/roles/cgi/ops-cgi.c +++ b/lib/roles/cgi/ops-cgi.c @@ -105,7 +105,7 @@ rops_destroy_role_cgi(struct lws *wsi) return 0; } -static void +void lws_cgi_sul_cb(lws_sorted_usec_list_t *sul) { struct lws_context_per_thread *pt = lws_container_of(sul, @@ -113,8 +113,9 @@ lws_cgi_sul_cb(lws_sorted_usec_list_t *sul) lws_cgi_kill_terminated(pt); - lws_sul_schedule(pt->context, (int)(pt - pt->context->pt), &pt->sul_cgi, - lws_cgi_sul_cb, 3 * LWS_US_PER_SEC); + if (pt->http.cgi_list) + lws_sul_schedule(pt->context, (int)(pt - pt->context->pt), + &pt->sul_cgi, lws_cgi_sul_cb, 3 * LWS_US_PER_SEC); } static int @@ -122,11 +123,8 @@ rops_pt_init_destroy_cgi(struct lws_context *context, const struct lws_context_creation_info *info, struct lws_context_per_thread *pt, int destroy) { - if (!destroy) { - lws_sul_schedule(context, (int)(pt - context->pt), &pt->sul_cgi, - lws_cgi_sul_cb, 3 * LWS_US_PER_SEC); - } else - lws_sul_cancel(&pt->sul_cgi); + + lws_sul_cancel(&pt->sul_cgi); return 0; }