From 0cfdd3b57d592fb6baa7dafe8fde124e8a6c7798 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 15 Nov 2017 15:30:21 +0100 Subject: [PATCH] assuan: Fix exponential decay for first second. * common/asshelp.c (wait_for_sock): Round SECSLEFT. * dirmngr/dirmngr.c (main): Take care of --debug-wait also in dameon mode. * common/sysutils.c (gnupg_usleep) [HAVE_NANOSLEEP]: Fix nanosleep use. -- Without the rounding we saw in verbose mose [...]to come up ... (5s) [...]to come up ... (4s) immediately without the expected one second delay. Waiting for the next seconds did not work if nanosleep was used due to improper passed parameters in gnupg_usleep. Adding --debug-wait for dirmngr in daemon mode is required to test this change. GnuPG-bug-id: 3490 Fixes-commit: 149041b0b917f4298239fe18b5ebd5ead71584a6 Signed-off-by: Werner Koch --- common/asshelp.c | 5 ++++- common/sysutils.c | 7 +++---- dirmngr/dirmngr.c | 8 ++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/common/asshelp.c b/common/asshelp.c index 542747af8..b9c0cf441 100644 --- a/common/asshelp.c +++ b/common/asshelp.c @@ -337,7 +337,10 @@ wait_for_sock (int secs, int which, const char *sockname, { if (verbose) { - secsleft = (target_us - elapsed_us)/1000000; + secsleft = (target_us - elapsed_us + 999999)/1000000; + /* log_clock ("left=%d last=%d targ=%d elap=%d next=%d\n", */ + /* secsleft, lastalert, target_us, elapsed_us, */ + /* next_sleep_us); */ if (secsleft < lastalert) { log_info (which == 1? diff --git a/common/sysutils.c b/common/sysutils.c index e90010c44..55a7ee9ec 100644 --- a/common/sysutils.c +++ b/common/sysutils.c @@ -340,11 +340,10 @@ gnupg_usleep (unsigned int usecs) struct timespec req; struct timespec rem; - req.tv_sec = 0; - req.tv_nsec = usecs * 1000; - + req.tv_sec = usecs / 1000000; + req.tv_nsec = (usecs % 1000000) * 1000; while (nanosleep (&req, &rem) < 0 && errno == EINTR) - req = rem; + req = rem; } #else /*Standard Unix*/ diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index 9cb02036e..631256ded 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -1193,6 +1193,14 @@ main (int argc, char **argv) current_logfile = xstrdup (logfile); } + if (debug_wait) + { + log_debug ("waiting for debugger - my pid is %u .....\n", + (unsigned int)getpid()); + gnupg_sleep (debug_wait); + log_debug ("... okay\n"); + } + #ifndef HAVE_W32_SYSTEM if (strchr (socket_name, ':')) {