From 3f3d60d3bbd10f6cc118d24aadc60e96b9854576 Mon Sep 17 00:00:00 2001 From: Robert Haas <rhaas@postgresql.org> Date: Thu, 9 Feb 2017 14:42:32 -0500 Subject: [PATCH] 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); } /*-------------------------------------------------------------------------- -- GitLab