aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2017-04-06 10:20:45 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2017-04-06 10:31:28 +0200
commit9fe2dfd3c4df334607083f989346090e1051a565 (patch)
treefe90ccde62088424dfaff57ada4972bfdee83722
parentca2051a26b74e1140cf2ca3ea0c82c1eed5bce28 (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.c11
1 files changed, 10 insertions, 1 deletions
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 <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);