]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Add master_service_set_killed_callback()
authorAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 3 Nov 2023 10:26:38 +0000 (12:26 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Nov 2023 10:49:10 +0000 (10:49 +0000)
Adds a callback that gets called when the master service is killed.

src/lib-master/master-service-private.h
src/lib-master/master-service.c
src/lib-master/master-service.h

index e2ec19ad0b64615efddbe1b845187a9f4a39f9b7..484e87c0b3027b6277c1c75a7dea812ef72d1c5f 100644 (file)
@@ -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;
index 079fc7a5e2eef1452b564b0f24c78c9d35047e75..3665449a1a9d8985b80b3a1763b421f69f2aca01 100644 (file)
@@ -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;
+}
index 21d8e4c85e94c8732cd1048835e45f7e814ea1a3..bb09d0f14ba3330c73e91a6357b58f1fd2a533f5 100644 (file)
@@ -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,