2001-12-18 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Tue, 18 Dec 2001 21:02:35 +0000 (21:02 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Tue, 18 Dec 2001 21:02:35 +0000 (21:02 +0000)
* rungpg.c (struct reap_s, reap_list, reap_list_lock): Moved to ...
* engine.c (struct reap_s, reap_list, reap_list_lock): ... here.
Include `time.h', `sys/types.h', `assert.h', and `sema.h'.

* rungpg.c (_gpgme_engine_add_child_to_reap_list): New function.
(do_reaping, _gpgme_gpg_housecleaning): Moved to ...
* engine.c (do_reaping, _gpgme_engine_housecleaning): ... here.
* rungpg.c (_gpgme_gpg_release): Replace code that is now in its
own function by call to _gpgme_engine_add_child_to_reap_list().

* wait.c: Include `engine.h'.
(run_idle): Call _gpgme_engine_housecleaning(), not
_gpgme_gpg_housecleaning().

trunk/gpgme/ChangeLog
trunk/gpgme/engine.c
trunk/gpgme/engine.h
trunk/gpgme/rungpg.c
trunk/gpgme/wait.c

index 62d1aaa4739ec0afc3f8cf30c1ced85492dc850e..defb9edcdf1d8dd657b7dc03f75070655bf0fed9 100644 (file)
@@ -1,3 +1,19 @@
+2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
+
+       * rungpg.c (struct reap_s, reap_list, reap_list_lock): Moved to ...
+       * engine.c (struct reap_s, reap_list, reap_list_lock): ... here.
+       Include `time.h', `sys/types.h', `assert.h', and `sema.h'.
+
+       * rungpg.c (_gpgme_engine_add_child_to_reap_list): New function.
+       (do_reaping, _gpgme_gpg_housecleaning): Moved to ...
+       * engine.c (do_reaping, _gpgme_engine_housecleaning): ... here.
+       * rungpg.c (_gpgme_gpg_release): Replace code that is now in its
+       own function by call to _gpgme_engine_add_child_to_reap_list().
+
+       * wait.c: Include `engine.h'.
+       (run_idle): Call _gpgme_engine_housecleaning(), not
+       _gpgme_gpg_housecleaning().
+       
 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
 
        * key.c (_gpgme_key_append_name): Append, not prepend, the uid.
index 025832bb07042167d7e3b5e657754a91b9ccc743..3c250c9eb11cb449255075a8f88706330e6839ba 100644 (file)
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include <time.h>
+#include <sys/types.h>
+#include <assert.h>
 
 #include "gpgme.h"
 #include "util.h"
+#include "sema.h"
 
 #include "engine.h"
 #include "rungpg.h"
@@ -44,6 +48,17 @@ struct engine_object_s
       } engine;
 };
 
+struct reap_s
+{
+  struct reap_s *next;
+  int pid;
+  time_t entered;
+  int term_send;
+};
+
+static struct reap_s *reap_list;
+DEFINE_STATIC_LOCK (reap_list_lock);
+
 /* Get the path of the engine for PROTOCOL.  */
 const char *
 _gpgme_engine_get_path (GpgmeProtocol proto)
@@ -433,7 +448,8 @@ _gpgme_engine_op_verify (EngineObject engine, GpgmeData sig, GpgmeData text)
   return 0;
 }
 
-GpgmeError _gpgme_engine_start (EngineObject engine, void *opaque)
+GpgmeError
+_gpgme_engine_start (EngineObject engine, void *opaque)
 {
   if (!engine)
     return mk_error (Invalid_Value);
@@ -449,3 +465,84 @@ GpgmeError _gpgme_engine_start (EngineObject engine, void *opaque)
     }
   return 0;
 }
+
+void
+_gpgme_engine_add_child_to_reap_list (void *buf, int buflen, pid_t pid)
+{
+  /* Reuse the memory, so that we don't need to allocate another
+     memory block and to handle errors.  */
+  struct reap_s *child = buf;
+
+  assert (buflen >= sizeof *child);
+  memset (child, 0, sizeof *child);
+  child->pid = pid;
+  child->entered = time (NULL);
+  LOCK(reap_list_lock);
+  child->next = reap_list;
+  reap_list = child;
+  UNLOCK(reap_list_lock);
+}
+
+static void
+do_reaping (void)
+{
+  struct reap_s *r, *rlast;
+  static time_t last_check;
+  time_t cur_time = time (NULL);
+
+  /* A race does not matter here.  */
+  if (!last_check)
+    last_check = time (NULL);
+
+  if (last_check >= cur_time)
+    return;  /* We check only every second.  */
+
+  /* Fixme: it would be nice if to have a TRYLOCK here.  */
+  LOCK (reap_list_lock);
+  for (r = reap_list, rlast = NULL; r; rlast = r, r = r ? r->next : NULL)
+    {
+      int dummy1, dummy2;
+
+      if (_gpgme_io_waitpid (r->pid, 0, &dummy1, &dummy2))
+       {
+         /* The process has terminated - remove it from the queue.  */
+         void *p = r;
+         if (!rlast)
+           {
+             reap_list = r->next;
+             r = reap_list;
+            }
+         else
+           {
+             rlast->next = r->next;
+             r = rlast;
+            }
+         xfree (p);
+        }
+      else if (!r->term_send)
+       {
+         if (r->entered + 1 >= cur_time)
+           {
+             _gpgme_io_kill (r->pid, 0);
+             r->term_send = 1;
+             r->entered = cur_time;
+            }
+        }
+      else
+       {
+         /* Give it 5 second before we are going to send the killer.  */
+         if (r->entered + 5 >= cur_time)
+           {
+             _gpgme_io_kill (r->pid, 1);
+             r->entered = cur_time; /* Just in case we have to repeat it.  */
+            }
+        }
+    }
+  UNLOCK (reap_list_lock);  
+}
+
+void
+_gpgme_engine_housecleaning (void)
+{
+  do_reaping ();
+}
index a2f2f6c2be1a0a0f0a9db9b3b4547d8e83d4b939..23be9dc9d3e26f3350a4736cb80e6f2731ada2bf 100644 (file)
@@ -63,4 +63,7 @@ GpgmeError _gpgme_engine_op_verify (EngineObject engine, GpgmeData sig,
                                    GpgmeData text);
 GpgmeError _gpgme_engine_start (EngineObject engine, void *opaque);
 
+void _gpgme_engine_add_child_to_reap_list (void *buf, int buflen, pid_t pid);
+void _gpgme_engine_housecleaning (void);
+
 #endif /* ENGINE_H */
index 6151f7ded40d2ebf1d6e140b3727a1521c00debd..dc3e2388d4a4715c9d6d992391b49f50ad313dcb 100644 (file)
@@ -118,17 +118,6 @@ struct gpg_object_s {
     } cmd;
 };
 
-struct reap_s {
-    struct reap_s *next;
-    int pid;
-    time_t entered;
-    int term_send;
-};
-
-static struct reap_s *reap_list;
-DEFINE_STATIC_LOCK (reap_list_lock);
-
-
 static void free_argv ( char **argv );
 static void free_fd_data_map ( struct fd_data_map_s *fd_data_map );
 
@@ -290,83 +279,11 @@ _gpgme_gpg_release (GpgObject gpg)
     _gpgme_io_close (gpg->colon.fd[1]);
   free_fd_data_map (gpg->fd_data_map);
   if (gpg->running)
-    {
-      int pid = gpg->pid;
-      struct reap_s *r;
-
-      /* Reuse the memory, so that we don't need to allocate another
-        memory block and to handle errors.  */
-      assert (sizeof *r < sizeof *gpg);
-      r = (void*)gpg;
-      memset (r, 0, sizeof *r);
-      r->pid = pid;
-      r->entered = time (NULL);
-      LOCK(reap_list_lock);
-      r->next = reap_list;
-      reap_list = r;
-      UNLOCK(reap_list_lock);
-    }
+    _gpgme_engine_add_child_to_reap_list (gpg, sizeof *gpg, gpg->pid);
   else
     xfree (gpg);
 }
 
-
-static void
-do_reaping (void)
-{
-    struct reap_s *r, *rlast;
-    static time_t last_check;
-    time_t cur_time = time (NULL);
-
-    /* a race does not matter here */
-    if (!last_check)
-        last_check = time(NULL);
-
-    if (last_check >= cur_time)
-        return;  /* we check only every second */
-
-    /* fixme: it would be nice if to have a TRYLOCK here */
-    LOCK (reap_list_lock);  
-    for (r=reap_list,rlast=NULL; r ; rlast=r, r=r?r->next:NULL) {
-        int dummy1, dummy2;
-
-        if ( _gpgme_io_waitpid (r->pid, 0, &dummy1, &dummy2) ) {
-            /* process has terminated - remove it from the queue */
-            void *p = r;
-            if (!rlast) {
-                reap_list = r->next;
-                r = reap_list;
-            }
-            else {
-                rlast->next = r->next;
-                r = rlast;
-            }
-            xfree (p);
-        }
-        else if ( !r->term_send ) {
-            if( r->entered+1 >= cur_time ) {
-                _gpgme_io_kill ( r->pid, 0);
-                r->term_send = 1;
-                r->entered = cur_time;
-            }
-        }
-        else {
-            /* give it 5 second before we are going to send the killer */
-            if ( r->entered+5 >= cur_time ) {
-                _gpgme_io_kill (r->pid, 1);
-                r->entered = cur_time; /* just in case we have to repat it */
-            }
-        }
-    }
-    UNLOCK (reap_list_lock);  
-}
-
-void
-_gpgme_gpg_housecleaning ()
-{
-    do_reaping ();
-}
-
 void
 _gpgme_gpg_enable_pipemode ( GpgObject gpg )
 {
index a474126e5cc66504e00d7b3dd8c4946eb8a76485..a830c2d19d3612e95328d693137ea5fcfed39ebf 100644 (file)
@@ -34,6 +34,7 @@
 #include "wait.h"
 #include "sema.h"
 #include "io.h"
+#include "engine.h"
 
 struct wait_item_s;
 struct proc_s;
@@ -382,8 +383,7 @@ gpgme_register_idle ( void (*fnc)(void) )
 static void
 run_idle ()
 {
-    _gpgme_gpg_housecleaning ();
-    if (idle_function)
-        idle_function ();
+  _gpgme_engine_housecleaning ();
+  if (idle_function)
+    idle_function ();
 }
-