add cleanup for webdav module

8 weeks ago

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 30 Jan 2025 18:19:12 +0100 (8 weeks ago)
changeset 572
e70418bb14b1
parent 571
0fa595aefd0f
child 573
76ccfc2a932f

add cleanup for webdav module

src/server/daemon/webserver.c file | annotate | diff | comparison | revisions
src/server/webdav/webdav.c file | annotate | diff | comparison | revisions
--- a/src/server/daemon/webserver.c	Wed Jan 29 20:51:31 2025 +0100
+++ b/src/server/daemon/webserver.c	Thu Jan 30 18:19:12 2025 +0100
@@ -283,6 +283,11 @@
 }
 
 void webserver_end() {
+    cfgmgr_shutdown();
+    shutdown_threadpools(60);
+    
+    shutdown_eventhandlers_wait(); // TODO: timeout
+    
     // execute restart callbacks
     RestartCallback *re = atrestart;
     while(re) {
@@ -290,11 +295,6 @@
         re = re->next;
     }
     
-    cfgmgr_shutdown();
-    shutdown_threadpools(60);
-    
-    shutdown_eventhandlers_wait();
-    
     webserver_destroy();
 }
 
--- a/src/server/webdav/webdav.c	Wed Jan 29 20:51:31 2025 +0100
+++ b/src/server/webdav/webdav.c	Thu Jan 30 18:19:12 2025 +0100
@@ -77,6 +77,10 @@
 
 #define WEBDAV_RESOURCE_TYPE_COLLECTION "<D:collection/>"
 
+static void webdav_cleanup(void *data) {
+    cxMapDestroy(webdav_type_map);
+    cxMapDestroy(method_handler_map);
+}
 
 static WebdavBackend* default_backend_create(Session *sn, Request *rq, pblock *pb, void *initData) {
     WebdavBackend *dav = pool_malloc(sn->pool, sizeof(WebdavBackend));
@@ -105,10 +109,10 @@
 
 
 int webdav_register_backend(const char *name, webdav_init_func webdavInit, webdav_create_func webdavCreate) {
-    WebdavType *webdavType = malloc(sizeof(WebdavType));
-    webdavType->init = webdavInit;
-    webdavType->create = webdavCreate;
-    return cxMapPut(webdav_type_map, cx_hash_key_str(name), webdavType);
+    WebdavType webdavType;
+    webdavType.init = webdavInit;
+    webdavType.create = webdavCreate;
+    return cxMapPut(webdav_type_map, cx_hash_key_str(name), &webdavType);
 }
 
 WebdavType* webdav_get_type(cxstring dav_class) {
@@ -146,7 +150,7 @@
     }
     webdav_is_initialized = TRUE;
     
-    webdav_type_map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 8);
+    webdav_type_map = cxHashMapCreate(cxDefaultAllocator, sizeof(WebdavType), 8);
     if(!webdav_type_map) {
         return REQ_ABORTED;
     }
@@ -203,6 +207,8 @@
     dav_resourcetype_collection.value.data = dav_resourcetype_collection_value;
     dav_resourcetype_collection.vtype = WS_VALUE_XML_DATA;
     
+    webserver_atrestart(webdav_cleanup, NULL);
+    
     return REQ_PROCEED;
 }
 

mercurial