From 204afc1f4f37a4f1cb53ff44b993a661cc45bf5d Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Mon, 17 Oct 2016 09:35:14 +0300 Subject: [PATCH] lib-program-client: Add switch_ioloop vfunc This lets program-client backends do their own special io loop switching. --- src/lib-program-client/program-client-local.c | 12 ++++++++++++ src/lib-program-client/program-client-private.h | 1 + src/lib-program-client/program-client-remote.c | 6 ++++++ src/lib-program-client/program-client.c | 2 +- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/lib-program-client/program-client-local.c b/src/lib-program-client/program-client-local.c index 8be206ab32..c5037139d9 100644 --- a/src/lib-program-client/program-client-local.c +++ b/src/lib-program-client/program-client-local.c @@ -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; diff --git a/src/lib-program-client/program-client-private.h b/src/lib-program-client/program-client-private.h index 5f78acf8dc..ab0bac4cf1 100644 --- a/src/lib-program-client/program-client-private.h +++ b/src/lib-program-client/program-client-private.h @@ -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); diff --git a/src/lib-program-client/program-client-remote.c b/src/lib-program-client/program-client-remote.c index 7d55a9295c..9933297151 100644 --- a/src/lib-program-client/program-client-remote.c +++ b/src/lib-program-client/program-client-remote.c @@ -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_unix_create(const char *socket_path, const char *const *args, const struct program_client_settings *set, @@ -330,6 +335,7 @@ program_client_unix_create(const char *socket_path, const char *const *args, pclient->client.connect = program_client_unix_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; diff --git a/src/lib-program-client/program-client.c b/src/lib-program-client/program-client.c index bf854003b3..be424a955a 100644 --- a/src/lib-program-client/program-client.c +++ b/src/lib-program-client/program-client.c @@ -563,7 +563,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