]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-program-client: Add switch_ioloop vfunc
authorAki Tuomi <aki.tuomi@dovecot.fi>
Mon, 17 Oct 2016 06:35:14 +0000 (09:35 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 19 Oct 2016 13:43:30 +0000 (16:43 +0300)
This lets program-client backends do their own
special io loop switching.

src/lib-program-client/program-client-local.c
src/lib-program-client/program-client-private.h
src/lib-program-client/program-client-remote.c
src/lib-program-client/program-client.c

index 8be206ab329c6d5eb34c528fa521bb8c0d9697e8..c5037139d9326b04e0b0c8e69b399f8f909d13eb 100644 (file)
@@ -465,6 +465,17 @@ void program_client_local_destroy(struct program_client *pclient ATTR_UNUSED)
        child_wait_deinit();
 }
 
+static
+void program_client_local_switch_ioloop(struct program_client *pclient)
+{
+       struct program_client_local *slclient =
+               (struct program_client_local *)pclient;
+
+       if (slclient->to_kill)
+               slclient->to_kill = io_loop_move_timeout(&slclient->to_kill);
+       lib_signals_reset_ioloop();
+}
+
 struct program_client *
 program_client_local_create(const char *bin_path,
                            const char *const *args,
@@ -478,6 +489,7 @@ program_client_local_create(const char *bin_path,
        program_client_init(&pclient->client, pool, bin_path, args, set);
        pclient->client.connect = program_client_local_connect;
        pclient->client.close_output = program_client_local_close_output;
+       pclient->client.switch_ioloop = program_client_local_switch_ioloop;
        pclient->client.disconnect = program_client_local_disconnect;
        pclient->client.destroy = program_client_local_destroy;
        pclient->pid = -1;
index 5f78acf8dce1f5476158367ebbef26e4c6654c72..ab0bac4cf1a3aaec99b012e85546490656dbc524 100644 (file)
@@ -53,6 +53,7 @@ struct program_client {
 
        int (*connect) (struct program_client * pclient);
        int (*close_output) (struct program_client * pclient);
+       void (*switch_ioloop) (struct program_client * pclient);
        void (*disconnect) (struct program_client * pclient, bool force);
        void (*destroy) (struct program_client * pclient);
 
index f02f379b20a6a381f165ab6755a471dd268c0b77..2b4b10c4933f20c9525845a369fc8629ee74a14a 100644 (file)
@@ -316,6 +316,11 @@ void program_client_remote_disconnect(struct program_client *pclient, bool force
        program_client_disconnected(pclient);
 }
 
+static
+void program_client_remote_switch_ioloop(struct program_client *pclient ATTR_UNUSED)
+{
+}
+
 struct program_client *
 program_client_remote_create(const char *socket_path, const char *const *args,
                             const struct program_client_settings *set,
@@ -330,6 +335,7 @@ program_client_remote_create(const char *socket_path, const char *const *args,
        pclient->client.connect = program_client_remote_connect;
        pclient->client.close_output = program_client_remote_close_output;
        pclient->client.disconnect = program_client_remote_disconnect;
+       pclient->client.switch_ioloop = program_client_remote_switch_ioloop;
        pclient->noreply = noreply;
 
        return &pclient->client;
index 96c74b76e397159d4e100ee04310051cc659fefc..c1eb91880f96118ab30e98088107ab4cb75a48f7 100644 (file)
@@ -568,7 +568,7 @@ void program_client_switch_ioloop(struct program_client *pclient)
                pclient->to = io_loop_move_timeout(&pclient->to);
        if (pclient->io != NULL)
                pclient->io = io_loop_move_io(&pclient->io);
-       lib_signals_reset_ioloop();
+       pclient->switch_ioloop(pclient);
 }
 
 static