From 1365f9d0266ed212019fcbfefbd7ac1ade50e797 Mon Sep 17 00:00:00 2001 From: Georg Reinke Date: Mon, 10 Apr 2017 11:39:35 +0200 Subject: [PATCH] queue_signalled: handle cancellation while waiting correctly --- lib/queue_signalled.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/queue_signalled.c b/lib/queue_signalled.c index 71ae87d21..0d0706fdd 100644 --- a/lib/queue_signalled.c +++ b/lib/queue_signalled.c @@ -39,8 +39,11 @@ int queue_signalled_push_many(struct queue_signalled *qs, void *ptr[], size_t cn int queue_signalled_pull_many(struct queue_signalled *qs, void *ptr[], size_t cnt) { + /* Make sure that qs->mt is unlocked if this thread gets cancelled. */ + pthread_cleanup_push((void (*)(void*)) pthread_mutex_unlock, &qs->mt); pthread_mutex_lock(&qs->mt); pthread_cond_wait(&qs->ready, &qs->mt); pthread_mutex_unlock(&qs->mt); + pthread_cleanup_pop(0); return queue_pull_many(&qs->q, ptr, cnt); }