diff options
author | José Bollo <jose.bollo@iot.bzh> | 2019-09-13 11:01:42 +0200 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2019-09-13 11:07:57 +0200 |
commit | 7129df470867291f917e6718dad2a964e113aad6 (patch) | |
tree | 9fbfa9f12b5ae3a1e0648960b23b349937215fe8 | |
parent | 45a4e69d4ef15c70d2b74ea4d0d2e4cd22e3adea (diff) |
jobs: Wake up an event loop if needed
A queued job must be treated. It was not the case
when the job was queued from a foreign thread.
This change detect that a potential hang exists
and wake up an event loop to avoid it.
Bug-AGL: SPEC-2809
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Change-Id: Id12d32771ea37df5f5f2e208ec9645a6c4b0d0ab
-rw-r--r-- | src/jobs.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -510,7 +510,7 @@ static int queue_job( enum start_mode start_mode) { struct job *job; - int rc; + int rc, busy; pthread_mutex_lock(&mutex); @@ -527,8 +527,9 @@ static int queue_job( goto error; /* start a thread if needed */ + busy = busy_thread_count == started_thread_count; if (start_mode != Start_Lazy - && busy_thread_count == started_thread_count + && busy && (start_mode == Start_Urgent || remaining_job_count + started_thread_count < allowed_job_count) && started_thread_count < allowed_thread_count) { /* all threads are busy and a new can be started */ @@ -537,11 +538,16 @@ static int queue_job( ERROR("can't start initial thread: %m"); goto error2; } + busy = 0; } /* queues the job */ job_add(job); + /* wakeup an evloop if needed */ + if (busy) + evloop_wakeup(); + /* signal an existing job */ pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); |