diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/storage/lmgr/condition_variable.c | 32 | ||||
-rw-r--r-- | src/include/storage/condition_variable.h | 4 |
2 files changed, 13 insertions, 23 deletions
diff --git a/src/backend/storage/lmgr/condition_variable.c b/src/backend/storage/lmgr/condition_variable.c index cac3d36b6a3..60234db4cd0 100644 --- a/src/backend/storage/lmgr/condition_variable.c +++ b/src/backend/storage/lmgr/condition_variable.c @@ -186,11 +186,14 @@ ConditionVariableCancelSleep(void) } /* - * Wake up one sleeping process, assuming there is at least one. + * Wake up the oldest process sleeping on the CV, if there is any. * - * The return value indicates whether or not we woke somebody up. + * Note: it's difficult to tell whether this has any real effect: we know + * whether we took an entry off the list, but the entry might only be a + * sentinel. Hence, think twice before proposing that this should return + * a flag telling whether it woke somebody. */ -bool +void ConditionVariableSignal(ConditionVariable *cv) { PGPROC *proc = NULL; @@ -203,24 +206,19 @@ ConditionVariableSignal(ConditionVariable *cv) /* If we found someone sleeping, set their latch to wake them up. */ if (proc != NULL) - { SetLatch(&proc->procLatch); - return true; - } - - /* No sleeping processes. */ - return false; } /* - * Wake up all sleeping processes. + * Wake up all processes sleeping on the given CV. * - * The return value indicates the number of processes we woke. + * This guarantees to wake all processes that were sleeping on the CV + * at time of call, but processes that add themselves to the list mid-call + * will typically not get awakened. */ -int +void ConditionVariableBroadcast(ConditionVariable *cv) { - int nwoken = 0; int pgprocno = MyProc->pgprocno; PGPROC *proc = NULL; bool have_sentinel = false; @@ -270,10 +268,7 @@ ConditionVariableBroadcast(ConditionVariable *cv) /* Awaken first waiter, if there was one. */ if (proc != NULL) - { SetLatch(&proc->procLatch); - ++nwoken; - } while (have_sentinel) { @@ -297,11 +292,6 @@ ConditionVariableBroadcast(ConditionVariable *cv) SpinLockRelease(&cv->mutex); if (proc != NULL && proc != MyProc) - { SetLatch(&proc->procLatch); - ++nwoken; - } } - - return nwoken; } diff --git a/src/include/storage/condition_variable.h b/src/include/storage/condition_variable.h index f9f93e0d4a2..c7afbbca429 100644 --- a/src/include/storage/condition_variable.h +++ b/src/include/storage/condition_variable.h @@ -53,7 +53,7 @@ extern void ConditionVariableCancelSleep(void); extern void ConditionVariablePrepareToSleep(ConditionVariable *); /* Wake up a single waiter (via signal) or all waiters (via broadcast). */ -extern bool ConditionVariableSignal(ConditionVariable *); -extern int ConditionVariableBroadcast(ConditionVariable *); +extern void ConditionVariableSignal(ConditionVariable *cv); +extern void ConditionVariableBroadcast(ConditionVariable *cv); #endif /* CONDITION_VARIABLE_H */ |