8 weeks ago
add shutdown cleanup (listener, log, threadpool)
--- a/src/server/daemon/httplistener.c Fri Jan 31 21:27:54 2025 +0100 +++ b/src/server/daemon/httplistener.c Sat Feb 01 09:23:14 2025 +0100 @@ -77,16 +77,25 @@ static pthread_mutex_t listener_mutex = PTHREAD_MUTEX_INITIALIZER; +static void wssocket_free(WSSocket *s) { + close(s->socket); + free(s); +} int http_listener_global_init(void) { listener_socket_map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 4); if(!listener_socket_map) { return 1; } + listener_socket_map->simple_destructor = (cx_destructor_func)wssocket_free; return 0; } +void http_listener_global_shutdown(void) { + cxMapDestroy(listener_socket_map); +} + int start_all_listener() { ServerConfiguration *conf = cfgmgr_get_server_config(); CxList *ls = conf->listeners; @@ -428,6 +437,9 @@ if(listener->shutdown) { pthread_mutex_destroy(&listener->shutdown_mutex); pthread_cond_destroy(&listener->shutdown_cond); + + free(listener->acceptors); + free(listener->acceptors6); } } @@ -556,6 +568,7 @@ ts.tv_sec += 60; pthread_cond_timedwait(&listener->shutdown_cond, &listener->shutdown_mutex, &ts); + pthread_mutex_unlock(&listener->shutdown_mutex); } @@ -677,7 +690,6 @@ // create Connection object Connection *conn = malloc(sizeof(Connection)); - uint32_t conn_id; RAND_bytes((unsigned char*)&conn->id, sizeof(conn->id)); conn->id <<= 16; conn->address = ca; @@ -759,6 +771,8 @@ cfg_unref(acceptor->listener->cfg); + free(acceptor); + return NULL; }
--- a/src/server/daemon/httplistener.h Fri Jan 31 21:27:54 2025 +0100 +++ b/src/server/daemon/httplistener.h Sat Feb 01 09:23:14 2025 +0100 @@ -142,6 +142,8 @@ */ int http_listener_global_init(void); +void http_listener_global_shutdown(void); + int start_all_listener(); HttpListener* http_listener_create(ListenerConfig *conf);
--- a/src/server/daemon/log.c Fri Jan 31 21:27:54 2025 +0100 +++ b/src/server/daemon/log.c Sat Feb 01 09:23:14 2025 +0100 @@ -415,3 +415,15 @@ return log; } +void shutdown_logging(void) { + CxIterator i = cxMapIteratorValues(access_log_files); + cx_foreach(LogFile *, log, i) { + fclose(log->file); + free(log); + } + cxMapDestroy(access_log_files); + + if(log_dup_list) { + cxListDestroy(log_dup_list); + } +}
--- a/src/server/daemon/log.h Fri Jan 31 21:27:54 2025 +0100 +++ b/src/server/daemon/log.h Sat Feb 01 09:23:14 2025 +0100 @@ -81,6 +81,8 @@ // access logging LogFile* get_access_log_file(cxstring file); +void shutdown_logging(void); + #ifdef __cplusplus } #endif
--- a/src/server/daemon/threadpools.c Fri Jan 31 21:27:54 2025 +0100 +++ b/src/server/daemon/threadpools.c Sat Feb 01 09:23:14 2025 +0100 @@ -158,4 +158,6 @@ cx_foreach(threadpool_t*, tp, i) { threadpool_shutdown(tp, timeout); } + cxMapDestroy(thread_pool_map); + cxMapDestroy(io_pool_map); }
--- a/src/server/daemon/webserver.c Fri Jan 31 21:27:54 2025 +0100 +++ b/src/server/daemon/webserver.c Sat Feb 01 09:23:14 2025 +0100 @@ -291,6 +291,8 @@ shutdown_eventhandlers_wait(); // TODO: timeout + shutdown_logging(); + // execute restart callbacks RestartCallback *re = atrestart; RestartCallback *re_next; @@ -353,12 +355,14 @@ func_cleanup(); ServerConfiguration *scfg = cfgmgr_get_server_config(); - CxIterator i = cxListIterator(scfg->logfiles); - cx_foreach(AccessLog *, logfile, i) { - fclose(logfile->log->file); + CxIterator i = cxListIterator(scfg->listeners); + cx_foreach(HttpListener *, ls, i) { + http_listener_destroy(ls); } pool_destroy(scfg->pool); + http_listener_global_shutdown(); + free(pwbuf); }
--- a/src/server/util/thrpool.c Fri Jan 31 21:27:54 2025 +0100 +++ b/src/server/util/thrpool.c Sat Feb 01 09:23:14 2025 +0100 @@ -254,12 +254,6 @@ while(t < end || i < 2) { uint32_t num_threads = pool->num_threads; if(num_threads == 0) { - // it's possible that we send too many kill jobs, cleanup the queue - while(pool->queue) { - pool_queue_t *q = pool->queue->next; - free(pool->queue); - pool->queue = q; - } break; } @@ -269,7 +263,18 @@ t = time(NULL); } - if(pool->num_threads) { + if(pool->num_threads == 0) { + // it's possible that we send too many kill jobs, cleanup the queue + while(pool->queue) { + pool_queue_t *q = pool->queue->next; + free(pool->queue); + pool->queue = q; + } + + free(pool->threads); + free(pool->thrstatus); + free(pool); + log_ereport(LOG_VERBOSE, "threadpool_shutdown successful"); } else if(t > end) { log_ereport(LOG_WARN, "threadpool_shutdown: timeout");