From: Robert Haas Date: Thu, 9 Feb 2017 19:42:32 +0000 (-0500) Subject: Fix race condition in ConditionVariablePrepareToSleep. X-Git-Tag: REL_10_BETA1~921 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3f3d60d3bbd10f6cc118d24aadc60e96b9854576;p=thirdparty%2Fpostgresql.git Fix race condition in ConditionVariablePrepareToSleep. Thomas Munro --- 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); } /*--------------------------------------------------------------------------