aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2019-09-13 11:01:42 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2019-09-13 11:07:57 +0200
commit7129df470867291f917e6718dad2a964e113aad6 (patch)
tree9fbfa9f12b5ae3a1e0648960b23b349937215fe8
parent45a4e69d4ef15c70d2b74ea4d0d2e4cd22e3adea (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.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/jobs.c b/src/jobs.c
index a9773aa5..3b617b56 100644
--- a/src/jobs.c
+++ b/src/jobs.c
@@ -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);