aboutsummaryrefslogtreecommitdiffstats
path: root/agent/gpg-agent.c
diff options
context:
space:
mode:
authorDaniel Kahn Gillmor <[email protected]>2016-11-01 04:45:23 +0000
committerDaniel Kahn Gillmor <[email protected]>2019-07-20 18:16:20 +0000
commitd369f30f319f94ec0f8f7b644241b18f03334bc7 (patch)
treedb2f0ba907f3ad5e1f14e40a7b3ac5d56294d5a8 /agent/gpg-agent.c
parentagent: Create framework of scheduled timers. (diff)
downloadgnupg-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.c16
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. */