X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=agent%2Fgpg-agent.c;fp=agent%2Fgpg-agent.c;h=1bfe0f3ae2a9e10001c93008ee1b7a43dd69436e;hb=2752527e5270b7796ed7f8dded78cf6891d33db1;hp=04a775c9be4d04cb1b99114ffb7c8c395d1008dc;hpb=9326d2a7de29595657fdc1997705a5d8739b8f71;p=gnupg2.git diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 04a775c..1bfe0f3 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -2267,6 +2267,26 @@ create_directories (void) } +static int +need_tick (void) +{ +#ifdef HAVE_W32_SYSTEM + /* We do not know how to interrupt the select loop on Windows, so we + always need a short tick there. */ + return 1; +#else + /* if we were invoked like "gpg-agent cmd arg1 arg2" then we need to + watch our parent. */ + if (parent_pid != (pid_t)(-1)) + return 1; + /* if scdaemon is running, we need to check that it's alive */ + if (agent_scd_check_running ()) + return 1; + /* otherwise, nothing fine-grained to do. */ + return 0; +#endif /*HAVE_W32_SYSTEM*/ +} + /* This is the worker for the ticker. It is called every few seconds and may only do fast operations. */ @@ -2325,7 +2345,7 @@ agent_sigusr2_action (void) #ifndef HAVE_W32_SYSTEM /* The signal handler for this program. It is expected to be run in - its own trhead and not in the context of a signal handler. */ + its own thread and not in the context of a signal handler. */ static void handle_signal (int signo) { @@ -2872,6 +2892,9 @@ handle_connections (gnupg_fd_t listen_fd, thus a simple assignment is fine to copy the entire set. */ read_fdset = fdset; + /* avoid a fine-grained timer if we don't need one: */ + timertbl[0].interval.tv_sec = need_tick () ? TIMERTICK_INTERVAL : 0; + /* loop through all timers, fire any registered functions, and plan next timer to trigger */ npth_clock_gettime (&curtime);