From: Stephan Bosch Date: Fri, 10 Apr 2020 15:30:51 +0000 (+0200) Subject: lib-master: master-service - Add master_service_deinit_forked(). X-Git-Tag: 2.3.13~650 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eebbe6f4b1a8cb218249d350f02ebff470321d66;p=thirdparty%2Fdovecot%2Fcore.git lib-master: master-service - Add master_service_deinit_forked(). --- diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index d7bc7e1221..b3691cae00 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -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; diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 435079171d..044545f1e6 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -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: