changeset 10033:40a71105529b HEAD

lib-master: If config fd is kept open, close it after last connection has been created.
author Timo Sirainen <tss@iki.fi>
date Fri, 09 Oct 2009 21:25:27 -0400
parents ebe9b1e7a46b
children cf376fcbd6ff
files src/lib-master/master-service.c
diffstat 1 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-master/master-service.c	Fri Oct 09 21:02:56 2009 -0400
+++ b/src/lib-master/master-service.c	Fri Oct 09 21:25:27 2009 -0400
@@ -475,6 +475,15 @@
 	}
 }
 
+static void master_service_close_config_fd(struct master_service *service)
+{
+	if (service->config_fd != -1) {
+		if (close(service->config_fd) < 0)
+			i_error("close(master config fd) failed: %m");
+		service->config_fd = -1;
+	}
+}
+
 void master_service_deinit(struct master_service **_service)
 {
 	struct master_service *service = *_service;
@@ -483,6 +492,7 @@
 
 	io_listeners_remove(service);
 
+	master_service_close_config_fd(service);
 	if (service->io_status_error != NULL)
 		io_remove(&service->io_status_error);
 	if (service->io_status_write != NULL)
@@ -549,7 +559,13 @@
 	service->master_status.available_count--;
         master_status_update(service);
 
-        service->callback(&conn);
+	service->callback(&conn);
+
+	if (service->master_status.available_count == 0 &&
+	    service->service_count_left == 1) {
+		/* we're dying as soon as this connection closes. */
+		master_service_close_config_fd(service);
+	}
 }
 
 static void io_listeners_init(struct master_service *service)