From: José Bollo Date: Thu, 6 Apr 2017 08:20:45 +0000 (+0200) Subject: Avoid to stick on event loop X-Git-Tag: dab_3.99.1~92 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Fapp-framework-binder.git;a=commitdiff_plain;h=9fe2dfd3c4df334607083f989346090e1051a565 Avoid to stick on event loop 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 --- 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);