diff options
author | Daniel Kahn Gillmor <[email protected]> | 2016-11-01 04:45:23 +0000 |
---|---|---|
committer | Daniel Kahn Gillmor <[email protected]> | 2019-07-20 18:16:20 +0000 |
commit | d369f30f319f94ec0f8f7b644241b18f03334bc7 (patch) | |
tree | db2f0ba907f3ad5e1f14e40a7b3ac5d56294d5a8 /agent/gpg-agent.c | |
parent | agent: Create framework of scheduled timers. (diff) | |
download | gnupg-d369f30f319f94ec0f8f7b644241b18f03334bc7.tar.gz gnupg-d369f30f319f94ec0f8f7b644241b18f03334bc7.zip |
agent: Allow threads to interrupt main select loop with SIGCONT.
* agent/gpg-agent.c (interrupt_main_thread_loop): New function on
non-windows platforms, allows other threads to interrupt the main loop
if there's something that the main loop might be interested in.
--
For example, the main loop might be interested in changes in program
state that affect the timers it expects to see.
I don't know how to do this on Windows platforms, but i welcome any
proposed improvements.
Signed-off-by: Daniel Kahn Gillmor <[email protected]>
Gbp-Pq: Topic gpg-agent-idling
Gbp-Pq: Name agent-Allow-threads-to-interrupt-main-select-loop-wi.patch
Diffstat (limited to 'agent/gpg-agent.c')
-rw-r--r-- | agent/gpg-agent.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 47b19ceb6..bdcbf9edc 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -417,6 +417,9 @@ static int have_homedir_inotify; * works reliable. */ static int reliable_homedir_inotify; +/* Record the pid of the main thread, for easier signalling */ +static pid_t main_thread_pid = (pid_t)(-1); + /* Number of active connections. */ static int active_connections; @@ -2472,6 +2475,10 @@ handle_signal (int signo) agent_sigusr2_action (); break; + /* nothing to do here, just take an extra cycle on the select loop */ + case SIGCONT: + break; + case SIGTERM: if (!shutdown_pending) log_info ("SIGTERM received - shutting down ...\n"); @@ -2810,6 +2817,13 @@ start_connection_thread_ssh (void *arg) } +void interrupt_main_thread_loop (void) +{ +#ifndef HAVE_W32_SYSTEM + kill (main_thread_pid, SIGCONT); +#endif +} + /* helper function for readability: test whether a given struct timespec is set to all-zeros */ static inline int @@ -2879,8 +2893,10 @@ handle_connections (gnupg_fd_t listen_fd, npth_sigev_add (SIGUSR1); npth_sigev_add (SIGUSR2); npth_sigev_add (SIGINT); + npth_sigev_add (SIGCONT); npth_sigev_add (SIGTERM); npth_sigev_fini (); + main_thread_pid = getpid (); #else # ifdef HAVE_W32CE_SYSTEM /* Use a dummy event. */ |