postgres.git / summary / log / commit / refs

commit    3f3d60d3bbd10f6cc118d24aadc60e96b9854576
Author:   Robert Haas <rhaas@postgresql.org>
Date:     Thu Feb 09 19:42:32 2017 +0000

    Fix race condition in ConditionVariablePrepareToSleep.
    
    Thomas Munro


src/backend/storage/lmgr/condition_variable.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/backend/storage/lmgr/condition_variable.c b/src/backend/storage/lmgr/condition_variable.c index 67fe177a7dd..6f1ef0b7e55 100644 --- a/src/backend/storage/lmgr/condition_variable.c +++ b/src/backend/storage/lmgr/condition_variable.c @@ -71,14 +71,17 @@ ConditionVariablePrepareToSleep(ConditionVariable *cv) &MyProc->procLatch, NULL); } + /* + * Reset my latch before adding myself to the queue and before entering + * the caller's predicate loop. + */ + ResetLatch(&MyProc->procLatch); + /* Add myself to the wait queue. */ SpinLockAcquire(&cv->mutex); if (!proclist_contains(&cv->wakeup, pgprocno, cvWaitLink)) proclist_push_tail(&cv->wakeup, pgprocno, cvWaitLink); SpinLockRelease(&cv->mutex); - - /* Reset my latch before entering the caller's predicate loop. */ - ResetLatch(&MyProc->procLatch); } /*-------------------------------------------------------------------------- [parent: fc8219dc54c9]