From f724a00033e1c6cb25459b151de46b7bd654397e Mon Sep 17 00:00:00 2001 From: Georg Reinke Date: Thu, 11 May 2017 13:49:54 +0200 Subject: [PATCH] queue_signalled: try to read once before sleeping --- lib/queue_signalled.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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); }