Fix race condition in ConditionVariablePrepareToSleep.

Thomas Munro
pull/17/merge
Robert Haas 9 years ago
parent fc8219dc54
commit 3f3d60d3bb
  1. 9
      src/backend/storage/lmgr/condition_variable.c

@ -71,14 +71,17 @@ ConditionVariablePrepareToSleep(ConditionVariable *cv)
&MyProc->procLatch, NULL); &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. */ /* Add myself to the wait queue. */
SpinLockAcquire(&cv->mutex); SpinLockAcquire(&cv->mutex);
if (!proclist_contains(&cv->wakeup, pgprocno, cvWaitLink)) if (!proclist_contains(&cv->wakeup, pgprocno, cvWaitLink))
proclist_push_tail(&cv->wakeup, pgprocno, cvWaitLink); proclist_push_tail(&cv->wakeup, pgprocno, cvWaitLink);
SpinLockRelease(&cv->mutex); SpinLockRelease(&cv->mutex);
/* Reset my latch before entering the caller's predicate loop. */
ResetLatch(&MyProc->procLatch);
} }
/*-------------------------------------------------------------------------- /*--------------------------------------------------------------------------

Loading…
Cancel
Save