* 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>
+
+ * 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.
#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"
} 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)
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);
}
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 ();
+}
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 */
} 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 );
_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 )
{
#include "wait.h"
#include "sema.h"
#include "io.h"
+#include "engine.h"
struct wait_item_s;
struct proc_s;
static void
run_idle ()
{
- _gpgme_gpg_housecleaning ();
- if (idle_function)
- idle_function ();
+ _gpgme_engine_housecleaning ();
+ if (idle_function)
+ idle_function ();
}
-