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;
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);
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;
/* 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: