Home GnuPG
Diffusion GnuPG 45a1ab501787

common: Improve lock strategy for dotlock.


common: Improve lock strategy for dotlock.

* common/dotlock.c (next_wait_interval): New.
(dotlock_take_unix): Use new function.
(dotlock_take_w32): Ditto.

In particular when using a dotlock file for protecting the spawning
and several processes try to spawn the agent or another component, we
often run into long delays. The solution is to is to exponential
backoff and also to reduce the initial delay from 50ms to 4ms. We
further limit the maximum wait period to about 2 seconds and then
repeat at intervals of 512, 1024 and 2048ms. In the wait-forever case
we add a small random value to have different intervals per process.

For testing this code snippet in the spawning function might be

const char *s;
if ((s=getenv("hold_gpg_file")))
  while (!gnupg_access (s, F_OK))
    gnupg_sleep (1);