summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-04-09 11:44:28 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-04-09 18:10:08 +0000
commitd58d8d2aeae4ab18dde060b6ca8cee1477eaa83b (patch)
tree134a555409cbba23f41950b6de95ceae904a6892
parent2e8e1f33eefd2ff96a49464964059105a4489427 (diff)
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 <thiago.macieira@intel.com> (cherry picked from commit c2348e2c7a4d92be21714deffed9c7a611e1b792) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/corelib/thread/qsemaphore.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/corelib/thread/qsemaphore.cpp b/src/corelib/thread/qsemaphore.cpp
index ee4cee5281..a1eb020f77 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;
}