]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: master-service - Add master_service_deinit_forked().
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 10 Apr 2020 15:30:51 +0000 (17:30 +0200)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Mon, 25 May 2020 15:29:02 +0000 (17:29 +0200)
src/lib-master/master-service.c
src/lib-master/master-service.h

index d7bc7e12214f63098c1adc09d68ac0b35ff0b742..b3691cae0068c5639cb51fdc1e859d6ae97b806c 100644 (file)
@@ -1067,10 +1067,9 @@ void master_service_close_config_fd(struct master_service *service)
        i_close_fd(&service->config_fd);
 }
 
-void master_service_deinit(struct master_service **_service)
+static void master_service_deinit_real(struct master_service **_service)
 {
        struct master_service *service = *_service;
-       unsigned int i;
 
        *_service = NULL;
 
@@ -1102,10 +1101,11 @@ void master_service_deinit(struct master_service **_service)
        i_free(master_service_category_name);
        master_service_category.name = NULL;
        event_unregister_callback(master_service_event_callback);
-       lib_signals_deinit();
-       /* run atexit callbacks before destroying ioloop */
-       lib_atexit_run();
-       io_loop_destroy(&service->ioloop);
+}
+
+static void master_service_free(struct master_service *service)
+{
+       unsigned int i;
 
        for (i = 0; i < service->socket_count; i++)
                i_free(service->listeners[i].name);
@@ -1115,10 +1115,33 @@ void master_service_deinit(struct master_service **_service)
        i_free(service->name);
        i_free(service->config_path);
        i_free(service);
+}
+
+void master_service_deinit(struct master_service **_service)
+{
+       struct master_service *service = *_service;
+
+       master_service_deinit_real(_service);
+
+       lib_signals_deinit();
+       /* run atexit callbacks before destroying ioloop */
+       lib_atexit_run();
+       io_loop_destroy(&service->ioloop);
 
+       master_service_free(service);
        lib_deinit();
 }
 
+void master_service_deinit_forked(struct master_service **_service)
+{
+       struct master_service *service = *_service;
+
+       master_service_deinit_real(_service);
+       io_loop_destroy(&service->ioloop);
+
+       master_service_free(service);
+}
+
 static void master_service_listen(struct master_service_listener *l)
 {
        struct master_service *service = l->service;
index 435079171d0eca7462302c96b7b3ae3ffd63fd1b..044545f1e608066cf263340a50462c79cf0d672a 100644 (file)
@@ -230,6 +230,11 @@ void master_service_client_connection_destroyed(struct master_service *service);
 
 /* Deinitialize the service. */
 void master_service_deinit(struct master_service **service);
+/* Deinitialize the service for a forked child process. Currently, the only
+   difference with master_service_deinit() is that lib_deinit() and
+   lib_signals_deinit() are not called.
+ */
+void master_service_deinit_forked(struct master_service **_service);
 
 /* Returns TRUE if line contains compatible service name and major version.
    The line is expected to be in format: