changeset 13082:c55ea4fc3344

lib-master: Added master_service_set_idle_die_callback()
author Timo Sirainen <tss@iki.fi>
date Mon, 27 Jun 2011 22:58:31 +0300
parents a5ab569ee4cd
children e07d2e37053d
files src/lib-master/master-service-private.h src/lib-master/master-service.c src/lib-master/master-service.h
diffstat 3 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-master/master-service-private.h	Mon Jun 27 22:57:56 2011 +0300
+++ b/src/lib-master/master-service-private.h	Mon Jun 27 22:58:31 2011 +0300
@@ -40,6 +40,7 @@
 	time_t last_sent_status_time;
 	struct timeout *to_status;
 
+	bool (*idle_die_callback)(void);
 	void (*die_callback)(void);
 	struct timeout *to_die;
 
--- a/src/lib-master/master-service.c	Mon Jun 27 22:57:56 2011 +0300
+++ b/src/lib-master/master-service.c	Mon Jun 27 22:58:31 2011 +0300
@@ -67,6 +67,10 @@
 		if (service->master_status.available_count !=
 		    service->total_available_count)
 			return;
+
+		if (service->idle_die_callback != NULL &&
+		    !service->idle_die_callback())
+			return;
 	}
 
 	service->killed = TRUE;
@@ -271,6 +275,12 @@
 	service->die_callback = callback;
 }
 
+void master_service_set_idle_die_callback(struct master_service *service,
+					  bool (*callback)(void))
+{
+	service->idle_die_callback = callback;
+}
+
 bool master_service_parse_option(struct master_service *service,
 				 int opt, const char *arg)
 {
--- a/src/lib-master/master-service.h	Mon Jun 27 22:57:56 2011 +0300
+++ b/src/lib-master/master-service.h	Mon Jun 27 22:58:31 2011 +0300
@@ -76,6 +76,11 @@
    done forcibly. If NULL, the service is stopped immediately. */
 void master_service_set_die_callback(struct master_service *service,
 				     void (*callback)(void));
+/* "idle callback" is called when master thinks we're idling and asks us to
+   die. We'll do it only if the idle callback returns TRUE. This callback isn't
+   even called if the master service code knows that we're handling clients. */
+void master_service_set_idle_die_callback(struct master_service *service,
+					  bool (*callback)(void));
 /* Call the given callback when there are no available connections and master
    has indicated that it can't create any more processes to handle requests.
    The callback could decide to kill one of the existing connections. */