]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Call lib_atexit() callbacks before destroying the lib-master ioloop.
authorTimo Sirainen <tss@iki.fi>
Sun, 3 Nov 2013 18:56:25 +0000 (20:56 +0200)
committerTimo Sirainen <tss@iki.fi>
Sun, 3 Nov 2013 18:56:25 +0000 (20:56 +0200)
src/lib-master/master-service.c
src/lib/lib.c
src/lib/lib.h

index c3666aa67fa0922ba5f58c2a24b7917823e42206..6bae7f6aea022589c37bad36ae6d9906dd4e4ecd 100644 (file)
@@ -760,6 +760,8 @@ void master_service_deinit(struct master_service **_service)
                pool_unref(&service->set_pool);
        }
        lib_signals_deinit();
+       /* run atexit callbacks before destroying ioloop */
+       lib_atexit_run();
        io_loop_destroy(&service->ioloop);
 
        if (service->listener_names != NULL)
index daf4910eefb77fba357b675342e955a9d81b26a4..8fabd4c992fbb75d4042d4853c26065d1214b7cc 100644 (file)
@@ -53,6 +53,17 @@ void lib_atexit(lib_atexit_callback_t *callback)
        array_append(&atexit_callbacks, &callback, 1);
 }
 
+void lib_atexit_run(void)
+{
+       lib_atexit_callback_t *const *cbp;
+
+       if (array_is_created(&atexit_callbacks)) {
+               array_foreach(&atexit_callbacks, cbp)
+                       (**cbp)();
+               array_free(&atexit_callbacks);
+       }
+}
+
 void lib_init(void)
 {
        struct timeval tv;
@@ -68,14 +79,7 @@ void lib_init(void)
 
 void lib_deinit(void)
 {
-       lib_atexit_callback_t *const *cbp;
-
-       if (array_is_created(&atexit_callbacks)) {
-               array_foreach(&atexit_callbacks, cbp)
-                       (**cbp)();
-               array_free(&atexit_callbacks);
-       }
-
+       lib_atexit_run();
        ipwd_deinit();
        hostpid_deinit();
        data_stack_deinit();
index 4087bb4e885e643911de574539377dc7b56f98c5..6e799e97bc5b1c8d71cb82f01cae6e2c894f0f1b 100644 (file)
@@ -50,6 +50,9 @@ int close_keep_errno(int *fd);
    functions are still available. Also if lib_atexit() is called multiple times
    to the same callback, it's added only once. */
 void lib_atexit(lib_atexit_callback_t *callback);
+/* Manually run the atexit callbacks. lib_deinit() also does this if not
+   explicitly called. */
+void lib_atexit_run(void);
 
 void lib_init(void);
 void lib_deinit(void);