diff options
author | José Bollo <jose.bollo@iot.bzh> | 2017-04-06 10:20:45 +0200 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2017-04-06 10:31:28 +0200 |
commit | 9fe2dfd3c4df334607083f989346090e1051a565 (patch) | |
tree | fe90ccde62088424dfaff57ada4972bfdee83722 | |
parent | ca2051a26b74e1140cf2ca3ea0c82c1eed5bce28 (diff) |
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 <jose.bollo@iot.bzh>
-rw-r--r-- | src/jobs.c | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -18,6 +18,7 @@ #define _GNU_SOURCE #include <stdlib.h> +#include <stdint.h> #include <unistd.h> #include <signal.h> #include <time.h> @@ -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); |