Increase start timeout
authorWerner Koch <wk@gnupg.org>
Fri, 17 Dec 2010 16:55:13 +0000 (16:55 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 17 Dec 2010 16:55:13 +0000 (16:55 +0000)
common/ChangeLog
common/asshelp.c

index 92f23c2..de96b8d 100644 (file)
@@ -1,3 +1,10 @@
+2010-12-17  Werner Koch  <wk@g10code.com>
+
+       * asshelp.c (lock_spawning): Add arg VERBOSE.  Improve timeout
+       management.  Make callers pass a value for VERBOSE.
+       (lock_agent_spawning, unlock_agent_spawning): Remove.  Change
+       callers to use lock_spawning and unlock_spawning.
+
 2010-12-17  Marcus Brinkmann  <mb@g10code.com>
 
        * homedir.c (gnupg_cachedir): Create /temp subdirectories.
@@ -33,7 +40,7 @@
        * gettime.c (gnupg_get_isotime): Compare to (time_t)-1.
        (epoch2isotime): Ditto.
        (IS_INVALID_TIME_T): New.
-       (asctimestamp): Use lNew macro.
+       (asctimestamp): Use new macro.
        (strtimestamp, isotimestamp): Ditto.  Use snprintf.
 
 2010-10-25  Werner Koch  <wk@g10code.com>
index d752277..b8be103 100644 (file)
@@ -229,11 +229,15 @@ send_pinentry_environment (assuan_context_t ctx,
    of a variable to store the lock information and the name or the
    process.  */
 static gpg_error_t
-lock_spawning (lock_spawn_t *lock, const char *homedir, const char *name)
+lock_spawning (lock_spawn_t *lock, const char *homedir, const char *name,
+               int verbose)
 {
 #ifdef HAVE_W32_SYSTEM
   int waitrc;
-  
+  int timeout = (!strcmp (name, "agent")
+                 ? SECS_TO_WAIT_FOR_AGENT
+                 : SECS_TO_WAIT_FOR_DIRMNGR);
+
   (void)homedir; /* Not required. */
 
   *lock = CreateMutexW 
@@ -248,10 +252,19 @@ lock_spawning (lock_spawn_t *lock, const char *homedir, const char *name)
       return gpg_error (GPG_ERR_GENERAL);
     }
 
-  waitrc = WaitForSingleObject (*lock, 5000);
+ retry:
+  waitrc = WaitForSingleObject (*lock, 1000);
   if (waitrc == WAIT_OBJECT_0)
     return 0;
-
+  
+  if (waitrc == WAIT_TIMEOUT && timeout)
+    {
+      timeout--;
+      if (verbose)
+        log_info ("another process is trying to start the %s ... (%ds)\n",
+                  name, timeout);
+      goto retry;
+    }
   if (waitrc == WAIT_TIMEOUT)
     log_info ("error waiting for the spawn_%s mutex: timeout\n", name);
   else
@@ -261,6 +274,8 @@ lock_spawning (lock_spawn_t *lock, const char *homedir, const char *name)
 #else /*!HAVE_W32_SYSTEM*/
   char *fname;
 
+  (void)verbose;
+
   *lock = NULL;
 
   fname = make_filename
@@ -306,22 +321,6 @@ unlock_spawning (lock_spawn_t *lock, const char *name)
     }
 }
 
-/* Lock the agent spawning process.  The caller needs to provide the
-   address of a variable to store the lock information.  */
-static gpg_error_t
-lock_agent_spawning (lock_spawn_t *lock, const char *homedir)
-{
-  return lock_spawning (lock, homedir, "agent");
-}
-
-
-static void
-unlock_agent_spawning (lock_spawn_t *lock)
-{
-  unlock_spawning (lock, "agent");
-}
-
-
 /* Try to connect to the agent via socket or fork it off and work by
    pipes.  Handle the server's initial greeting.  Returns a new assuan
    context at R_CTX or an error code. */
@@ -420,7 +419,7 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
               argv[1] = "--use-standard-socket"; 
               argv[2] = NULL;  
 
-              if (!(err = lock_agent_spawning (&lock, homedir))
+              if (!(err = lock_spawning (&lock, homedir, "agent", verbose))
                   && assuan_socket_connect (ctx, sockname, 0, 0))
                 {
                   err = gnupg_spawn_process_detached (agent_program, argv,NULL);
@@ -453,7 +452,7 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
                     }
                 }
 
-              unlock_agent_spawning (&lock);
+              unlock_spawning (&lock, "agent");
             }
           else
             {
@@ -614,7 +613,7 @@ start_new_dirmngr (assuan_context_t *r_ctx,
       argv[0] = "--daemon";
       argv[1] = NULL;  
       
-      if (!(err = lock_spawning (&lock, homedir, "dirmngr"))
+      if (!(err = lock_spawning (&lock, homedir, "dirmngr", verbose))
           && assuan_socket_connect (ctx, sockname, 0, 0))
         {
           err = gnupg_spawn_process_detached (dirmngr_program, argv,NULL);