From 40cf5194922ef18cc309be9367449b19fe66d29e Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Sat, 5 Apr 2025 09:53:47 -0400 Subject: [PATCH] http: I caught an http listener lingering on shutdown. Clean them up more correctly. Possible progress on #108. --- src/http.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/http.c b/src/http.c index 6e73dc8af..ae8d1220a 100644 --- a/src/http.c +++ b/src/http.c @@ -785,8 +785,25 @@ void tf_http_add_handler(tf_http_t* http, const char* pattern, tf_http_callback_ static void _http_free_listener_on_close(uv_handle_t* handle) { tf_http_listener_t* listener = handle->data; + tf_http_t* http = listener->http; + for (int i = 0; i < http->listeners_count; i++) + { + if (http->listeners[i] == listener) + { + http->listeners[i] = http->listeners[http->listeners_count - 1]; + http->listeners_count--; + break; + } + } handle->data = NULL; tf_free(listener); + + if (!http->listeners_count) + { + tf_free(http->listeners); + http->listeners = NULL; + tf_http_destroy(http); + } } void tf_http_destroy(tf_http_t* http) @@ -812,6 +829,10 @@ void tf_http_destroy(tf_http_t* http) listener->cleanup(listener->user_data); listener->cleanup = NULL; } + if (listener->tcp.data && !uv_is_closing((uv_handle_t*)&listener->tcp)) + { + uv_close((uv_handle_t*)&listener->tcp, _http_free_listener_on_close); + } } for (int i = 0; i < http->handlers_count; i++) @@ -829,20 +850,11 @@ void tf_http_destroy(tf_http_t* http) http->user_data = NULL; } - if (http->connections_count == 0) + if (http->connections_count == 0 && http->listeners_count == 0) { tf_free(http->connections); http->connections = NULL; - for (int i = 0; i < http->listeners_count; i++) - { - tf_http_listener_t* listener = http->listeners[i]; - uv_close((uv_handle_t*)&listener->tcp, _http_free_listener_on_close); - } - tf_free(http->listeners); - http->listeners = NULL; - http->listeners_count = 0; - for (int i = 0; i < http->handlers_count; i++) { if (http->handlers[i].pattern)