8 weeks ago
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; }