Hi, ConditionVariablePrepareToSleep() has a race that can leave you hanging, introduced by me in the v4 patch. The problem is that that function resets our latch after adding our process to the wakeup list. With the right timing, the following sequence can happen:
1. ConditionVariablePrepareToSleep() adds us to the wakeup list. 2. Some other process calls ConditionVariableSignal(). It removes us from the wakeup list and sets our latch. 3. ConditionVariablePrepareToSleep() resets our latch. 4. We enter (or continue) our predicate loop. Our exit condition happens not to be true yet, so we call ConditionVariableSleep(). 5. ConditionVariableSleep() never returns because WaitEventSet() blocks. Our latch is not set, yet we are no longer in the wakeup list so ConditionalVariableSignal() will never set it. We should reset the latch first. Then there is no way to reach ConditionVariableSleep() with neither a set latch nor an entry in the wakeup queue. See attached. Thoughts? -- Thomas Munro http://www.enterprisedb.com
fix-condition-variable-race.patch
Description: Binary data
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers