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>
This commit is contained in:
Allan Sandfeld Jensen 2021-04-09 11:44:28 +02:00 committed by Qt Cherry-pick Bot
parent 2e8e1f33ee
commit d58d8d2aea

View File

@ -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;
}