mirror of https://gitee.com/openkylin/gnupg2.git
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 <dkg@fifthhorseman.net> Gbp-Pq: Topic gpg-agent-idling Gbp-Pq: Name agent-Allow-threads-to-interrupt-main-select-loop-wi.patch
This commit is contained in:
parent
603daf9980
commit
3d2a404247
|
@ -370,6 +370,7 @@ void *get_agent_scd_notify_event (void);
|
||||||
#endif
|
#endif
|
||||||
void agent_sighup_action (void);
|
void agent_sighup_action (void);
|
||||||
int map_pk_openpgp_to_gcry (int openpgp_algo);
|
int map_pk_openpgp_to_gcry (int openpgp_algo);
|
||||||
|
void interrupt_main_thread_loop (void);
|
||||||
|
|
||||||
/*-- command.c --*/
|
/*-- command.c --*/
|
||||||
gpg_error_t agent_inq_pinentry_launched (ctrl_t ctrl, unsigned long pid,
|
gpg_error_t agent_inq_pinentry_launched (ctrl_t ctrl, unsigned long pid,
|
||||||
|
|
|
@ -417,6 +417,9 @@ static int have_homedir_inotify;
|
||||||
* works reliable. */
|
* works reliable. */
|
||||||
static int reliable_homedir_inotify;
|
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. */
|
/* Number of active connections. */
|
||||||
static int active_connections;
|
static int active_connections;
|
||||||
|
|
||||||
|
@ -2472,6 +2475,10 @@ handle_signal (int signo)
|
||||||
agent_sigusr2_action ();
|
agent_sigusr2_action ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* nothing to do here, just take an extra cycle on the select loop */
|
||||||
|
case SIGCONT:
|
||||||
|
break;
|
||||||
|
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
if (!shutdown_pending)
|
if (!shutdown_pending)
|
||||||
log_info ("SIGTERM received - shutting down ...\n");
|
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
|
/* helper function for readability: test whether a given struct
|
||||||
timespec is set to all-zeros */
|
timespec is set to all-zeros */
|
||||||
static inline int
|
static inline int
|
||||||
|
@ -2879,8 +2893,10 @@ handle_connections (gnupg_fd_t listen_fd,
|
||||||
npth_sigev_add (SIGUSR1);
|
npth_sigev_add (SIGUSR1);
|
||||||
npth_sigev_add (SIGUSR2);
|
npth_sigev_add (SIGUSR2);
|
||||||
npth_sigev_add (SIGINT);
|
npth_sigev_add (SIGINT);
|
||||||
|
npth_sigev_add (SIGCONT);
|
||||||
npth_sigev_add (SIGTERM);
|
npth_sigev_add (SIGTERM);
|
||||||
npth_sigev_fini ();
|
npth_sigev_fini ();
|
||||||
|
main_thread_pid = getpid ();
|
||||||
#else
|
#else
|
||||||
# ifdef HAVE_W32CE_SYSTEM
|
# ifdef HAVE_W32CE_SYSTEM
|
||||||
/* Use a dummy event. */
|
/* Use a dummy event. */
|
||||||
|
|
Loading…
Reference in New Issue