summaryrefslogtreecommitdiff
path: root/src/worker.c
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2014-11-30 21:01:31 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2014-11-30 21:01:31 +0100
commit262da2492d77f2a6feab3a99a725dbddf6d16188 (patch)
tree22e31e0dc50b0ae6b38cfbb3a789aaccba5e72f4 /src/worker.c
parent55f9c3d2f3320917dba48c4c532c54483a0bce2b (diff)
downloadbiruda-262da2492d77f2a6feab3a99a725dbddf6d16188.tar.gz
biruda-262da2492d77f2a6feab3a99a725dbddf6d16188.tar.bz2
trying to catch termination of worker, but the glib main loop would be needed,
I think I need a new way of executing processes without glib
Diffstat (limited to 'src/worker.c')
-rw-r--r--src/worker.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/worker.c b/src/worker.c
index 06ecc7e..9fec49b 100644
--- a/src/worker.c
+++ b/src/worker.c
@@ -57,23 +57,37 @@ worker_state_t worker_state_from_str( const char *s )
typedef struct {
GPid pid;
gint out, err;
+ worker_t *worker;
} direct_glib_execution_worker_data_t;
+static void watch_child( GPid pid, gint status, gpointer *data )
+{
+ printf( "ENDENDEND %d\n", pid );
+ g_spawn_close_pid( pid );
+}
+
int worker_init( worker_t *worker )
{
+ if( worker->state == WORKER_STATE_RUNNING ) {
+ return 0;
+ }
+
gchar *argv[] = { worker->command, NULL };
worker->execution_data = malloc( sizeof( direct_glib_execution_worker_data_t ) );
direct_glib_execution_worker_data_t *wed =
(direct_glib_execution_worker_data_t *)worker->execution_data;
+ wed->worker = worker;
gboolean ret = g_spawn_async_with_pipes( NULL,
- argv, NULL, 0, NULL,
+ argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL,
NULL, &wed->pid, NULL, &wed->out, &wed->err, NULL );
if( !ret ) {
g_error( "Starting worker failed" );
return -1;
}
+ g_child_watch_add( wed->pid, (GChildWatchFunc)watch_child, (gpointer *)wed );
+
worker->state = WORKER_STATE_RUNNING;
return 0;