From 9fe2dfd3c4df334607083f989346090e1051a565 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Bollo?= Date: Thu, 6 Apr 2017 10:20:45 +0200 Subject: [PATCH] Avoid to stick on event loop MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When working synchronously, waiting continuously to an event can make deadlocks. This commit enforce threads that wait for some job completion to wait for a fixed amount of time. An alternative management with signals should be studied in future. Change-Id: Idcfadc60f8c14d73d7fa32e937c6ea0f552cc09b Signed-off-by: José Bollo --- src/jobs.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/jobs.c b/src/jobs.c index fa94ef18..1ed20fcb 100644 --- a/src/jobs.c +++ b/src/jobs.c @@ -18,6 +18,7 @@ #define _GNU_SOURCE #include +#include #include #include #include @@ -39,6 +40,9 @@ #define sig_monitor(to,cb,arg) (cb(0,arg)) #endif +#define EVENT_TIMEOUT_TOP ((uint64_t)-1) +#define EVENT_TIMEOUT_CHILD ((uint64_t)10000) + /** Internal shortcut for callback */ typedef void (*job_cb_t)(int, void*, void *, void*); @@ -61,6 +65,7 @@ struct events { struct events *next; struct sd_event *event; + uint64_t timeout; unsigned runs: 1; }; @@ -276,7 +281,7 @@ static void events_call(int signum, void *arg) { struct events *events = arg; if (!signum) - sd_event_run(events->event, (uint64_t) -1); + sd_event_run(events->event, events->timeout); } /** @@ -291,6 +296,7 @@ static void thread_run(volatile struct thread *me) struct thread **prv; struct job *job; struct events *events; + uint64_t evto; /* initialize description of itself and link it in the list */ me->tid = pthread_self(); @@ -300,9 +306,11 @@ static void thread_run(volatile struct thread *me) me->upper = current; if (current) { current->lowered = 1; + evto = EVENT_TIMEOUT_CHILD; } else { started++; sig_monitor_init_timeouts(); + evto = EVENT_TIMEOUT_TOP; } me->next = threads; threads = (struct thread*)me; @@ -341,6 +349,7 @@ static void thread_run(volatile struct thread *me) if (events) { /* run the events */ events->runs = 1; + events->timeout = evto; me->events = events; pthread_mutex_unlock(&mutex); sig_monitor(0, events_call, events); -- 2.16.6