From d58d8d2aeae4ab18dde060b6ca8cee1477eaa83b Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 9 Apr 2021 11:44:28 +0200 Subject: [PATCH] Fix futexNeedsWake() on 64-bit systems It was mistaking semaphore values over 0 as waiters, regardless of actual waiters. Change-Id: Icebd01592ca8bdc1687a29dc569e3b630a262606 Reviewed-by: Thiago Macieira (cherry picked from commit c2348e2c7a4d92be21714deffed9c7a611e1b792) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/thread/qsemaphore.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/corelib/thread/qsemaphore.cpp b/src/corelib/thread/qsemaphore.cpp index ee4cee52811..a1eb020f77e 100644 --- a/src/corelib/thread/qsemaphore.cpp +++ b/src/corelib/thread/qsemaphore.cpp @@ -150,10 +150,11 @@ static int futexAvailCounter(quintptr v) static bool futexNeedsWake(quintptr v) { - // If we're counting waiters, the number of waiters is stored in the low 31 - // bits of the high word (that is, bits 32-62). If we're not, then we use - // bit 31 to indicate anyone is waiting. Either way, if any bit 31 or above - // is set, there are waiters. + // If we're counting waiters, the number of waiters plus value is stored in the + // low 31 bits of the high word (that is, bits 32-62). If we're not, then we only + // use futexNeedsWakeAllBit to indicate anyone is waiting. + if constexpr (futexHasWaiterCount) + return (v >> 32) > (unsigned(v)); return v >> 31; }