From: Aki Tuomi Date: Fri, 3 Nov 2023 10:26:38 +0000 (+0200) Subject: lib-master: Add master_service_set_killed_callback() X-Git-Tag: 2.4.0~2414 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=81133f6ec891d18aa7bf05034f48871f9f71db7c;p=thirdparty%2Fdovecot%2Fcore.git lib-master: Add master_service_set_killed_callback() Adds a callback that gets called when the master service is killed. --- diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index e2ec19ad0b..484e87c0b3 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -61,6 +61,9 @@ struct master_service { bool (*idle_die_callback)(void); void (*die_callback)(void); + master_service_killed_callback_t *killed_callback; + void *killed_context; + struct timeout *to_die; master_service_avail_overflow_callback_t *avail_overflow_callback; diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 079fc7a5e2..3665449a1a 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -132,6 +132,8 @@ static void sig_delayed_die(const siginfo_t *si, void *context) stopped in the middle. */ if (service->callback != NULL) io_loop_stop(service->ioloop); + if (service->killed_callback != NULL) + service->killed_callback(service->killed_context); } static bool sig_term_buf_get_kick_user(char *buf, const char **user_r) @@ -2090,3 +2092,12 @@ void master_service_set_last_kick_signal_user(struct master_service *service, "sigprocmask(SIG_SETMASK) failed: %m"); } } + +#undef master_service_set_killed_callback +void master_service_set_killed_callback(struct master_service *service, + master_service_killed_callback_t *callback, + void *context) +{ + service->killed_callback = callback; + service->killed_context = context; +} diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 21d8e4c85e..bb09d0f14b 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -110,6 +110,8 @@ master_service_avail_overflow_callback_t(bool kill, struct timeval *created_r); extern struct master_service *master_service; +typedef void master_service_killed_callback_t(void *); + extern const struct option master_service_helpopt; const char *master_service_getopt_string(void); @@ -178,6 +180,16 @@ void master_service_set_die_callback(struct master_service *service, 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)); +/* Set a callback that gets called when the service is killed, but not dead yet. */ +void master_service_set_killed_callback(struct master_service *service, + master_service_killed_callback_t *callback, + void *context); +#define master_service_set_killed_callback(service, callback, context) \ + master_service_set_killed_callback(service, \ + 1 ? (master_service_killed_callback_t *)callback : \ + CALLBACK_TYPECHECK(callback, void (*)(typeof(context))), \ + context) + /* 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. */ void master_service_set_avail_overflow_callback(struct master_service *service,