mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-08 20:00:17 +02:00
The Race: 1. A Reader sets `READ_WAITER_BIT` (Bit 15) and sleeps on the High 16 bits (`Futex+2`). 2. Writer A unlocks. It clears `READ_WAITER_BIT` (in Low 16 bits) and `WRITE_OWNED` (in High 16 bits). 3. Writer B immediately steals the lock. It sets `WRITE_OWNED` but preserves the now-cleared `READ_WAITER_BIT`. 4. The Reader, checking `Futex+2`, sees `WRITE_OWNED` is set. Since it cannot see that Bit 15 was unset (as it is watching High 16 bits), it assumes its wait signal is still valid and sleeps. 5. Writer B unlocks. It sees no `READ_WAITER_BIT` and wakes nobody. Deadlock. The Fix: Move `READ_WAITER_BIT` to Bit 30 (High 16 bits). Now, when Writer A clears the flag, the High 16 bits change value which will prevent the wait from occurring within WaitForAddress