X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fjobs.c;h=4b4472e54c0d801db1383d6d00202c209c1d5837;hb=c3249e6aa03ef10494a2a4a170bbed0cfc38a83e;hp=4b753fa1ffdb9508576da20120acf93367855296;hpb=5ed38596a529c1a63d6a3fab72861d14fbf1401c;p=src%2Fapp-framework-binder.git diff --git a/src/jobs.c b/src/jobs.c index 4b753fa1..4b4472e5 100644 --- a/src/jobs.c +++ b/src/jobs.c @@ -29,6 +29,9 @@ #include #include +#ifndef NO_JOBS_WATCHDOG +#include +#endif #include "jobs.h" #include "sig-monitor.h" @@ -652,14 +655,12 @@ static int on_evloop_efd(sd_event_source *s, int fd, uint32_t revents, void *use * Gets a sd_event item for the current thread. * @return a sd_event or NULL in case of error */ -struct sd_event *jobs_get_sd_event() +static struct sd_event *get_sd_event_locked() { struct evloop *el; uint64_t x; int rc; - pthread_mutex_lock(&mutex); - /* creates the evloop on need */ el = &evloop[0]; if (!el->sdev) { @@ -686,7 +687,6 @@ struct sd_event *jobs_get_sd_event() error2: close(el->efd); error1: - pthread_mutex_unlock(&mutex); return NULL; } } @@ -706,10 +706,24 @@ error1: pthread_cond_wait(&el->cond, &mutex); } - pthread_mutex_unlock(&mutex); return el->sdev; } +/** + * Gets a sd_event item for the current thread. + * @return a sd_event or NULL in case of error + */ +struct sd_event *jobs_get_sd_event() +{ + struct sd_event *result; + + pthread_mutex_lock(&mutex); + result = get_sd_event_locked(); + pthread_mutex_unlock(&mutex); + + return result; +} + /** * Enter the jobs processing loop. * @param allowed_count Maximum count of thread for jobs including this one @@ -751,6 +765,12 @@ int jobs_start(int allowed_count, int start_count, int waiter_count, void (*star running = 0; remains = waiter_count; +#ifndef NO_JOBS_WATCHDOG + /* set the watchdog */ + if (sd_watchdog_enabled(0, NULL)) + sd_event_set_watchdog(get_sd_event_locked(), 1); +#endif + /* start at least one thread */ launched = 0; while ((launched + 1) < start_count) {