diff --git a/lib/queue_signalled.c b/lib/queue_signalled.c index 38f372e49..fa0cd6f89 100644 --- a/lib/queue_signalled.c +++ b/lib/queue_signalled.c @@ -95,24 +95,35 @@ int queue_signalled_push_many(struct queue_signalled *qs, void *ptr[], size_t cn int queue_signalled_pull(struct queue_signalled *qs, void **ptr) { + int ret; /* Make sure that qs->mutex is unlocked if this thread gets cancelled. */ pthread_cleanup_push((void (*)(void*)) pthread_mutex_unlock, &qs->mutex); pthread_mutex_lock(&qs->mutex); - pthread_cond_wait(&qs->ready, &qs->mutex); + ret = queue_pull(&qs->queue, ptr); + if (!ret) + pthread_cond_wait(&qs->ready, &qs->mutex); pthread_mutex_unlock(&qs->mutex); pthread_cleanup_pop(0); + if (ret) + return ret; return queue_pull(&qs->queue, ptr); } int queue_signalled_pull_many(struct queue_signalled *qs, void *ptr[], size_t cnt) { + int ret; + /* Make sure that qs->mutex is unlocked if this thread gets cancelled. */ pthread_cleanup_push((void (*)(void*)) pthread_mutex_unlock, &qs->mutex); pthread_mutex_lock(&qs->mutex); - pthread_cond_wait(&qs->ready, &qs->mutex); + ret = queue_pull_many(&qs->queue, ptr, cnt); + if (!ret) + pthread_cond_wait(&qs->ready, &qs->mutex); pthread_mutex_unlock(&qs->mutex); pthread_cleanup_pop(0); + if (ret) + return ret; return queue_pull_many(&qs->queue, ptr, cnt); }