jobs: Fix possible race condition
authorJosé Bollo <jose.bollo@iot.bzh>
Thu, 30 Nov 2017 06:17:31 +0000 (07:17 +0100)
committerJosé Bollo <jose.bollo@iot.bzh>
Thu, 30 Nov 2017 06:33:31 +0000 (07:33 +0100)
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>
src/jobs.c

index 464f1e1..e3df8f5 100644 (file)
@@ -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;