diff options
author | José Bollo <jose.bollo@iot.bzh> | 2017-11-30 07:17:31 +0100 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2017-11-30 07:33:31 +0100 |
commit | 8a0bde7a0b5b61a08a43a5bf374fc4705b788684 (patch) | |
tree | 7366ac26121545d2b8e6c3b4ed59f745e5782c35 | |
parent | 2195a00dc5b70636ccf57563cf907cb3a4b62afc (diff) |
jobs: Fix possible race condition
Sending the signal while not being sure that is is
expected could be a race condition. Taking the mutex
avoids it.
In the same time, switch to broadcasting.
Change-Id: I3f43d0d860cccc61ec140ceef223f572f806872c
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r-- | src/jobs.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -636,7 +636,9 @@ static int on_evloop_efd(sd_event_source *s, int fd, uint32_t revents, void *use uint64_t x; struct evloop *evloop = userdata; read(evloop->efd, &x, sizeof x); - pthread_cond_signal(&evloop->cond); + pthread_mutex_lock(&mutex); + pthread_cond_broadcast(&evloop->cond); + pthread_mutex_unlock(&mutex); return 1; } @@ -656,7 +658,7 @@ struct sd_event *jobs_get_sd_event() el = &evloop[0]; if (!el->sdev) { /* creates the eventfd for waking up polls */ - el->efd = eventfd(0, EFD_CLOEXEC|EFD_SEMAPHORE); + el->efd = eventfd(0, EFD_CLOEXEC); if (el->efd < 0) { ERROR("can't make eventfd for events"); goto error1; |