add shutdown cleanup (listener, log, threadpool)

8 weeks ago

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 01 Feb 2025 09:23:14 +0100 (8 weeks ago)
changeset 577
4f5ccaea4a92
parent 576
5c31cc844c68
child 578
eb48f716b31c

add shutdown cleanup (listener, log, threadpool)

src/server/daemon/httplistener.c file | annotate | diff | comparison | revisions
src/server/daemon/httplistener.h file | annotate | diff | comparison | revisions
src/server/daemon/log.c file | annotate | diff | comparison | revisions
src/server/daemon/log.h file | annotate | diff | comparison | revisions
src/server/daemon/threadpools.c file | annotate | diff | comparison | revisions
src/server/daemon/webserver.c file | annotate | diff | comparison | revisions
src/server/util/thrpool.c file | annotate | diff | comparison | revisions
--- 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");

mercurial