diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/storage/ipc/barrier.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/backend/storage/ipc/barrier.c b/src/backend/storage/ipc/barrier.c index 3e200e02cc2..69afd586898 100644 --- a/src/backend/storage/ipc/barrier.c +++ b/src/backend/storage/ipc/barrier.c @@ -206,6 +206,28 @@ BarrierArriveAndDetach(Barrier *barrier) } /* + * Arrive at a barrier, and detach all but the last to arrive. Returns true if + * the caller was the last to arrive, and is therefore still attached. + */ +bool +BarrierArriveAndDetachExceptLast(Barrier *barrier) +{ + SpinLockAcquire(&barrier->mutex); + if (barrier->participants > 1) + { + --barrier->participants; + SpinLockRelease(&barrier->mutex); + + return false; + } + Assert(barrier->participants == 1); + ++barrier->phase; + SpinLockRelease(&barrier->mutex); + + return true; +} + +/* * Attach to a barrier. All waiting participants will now wait for this * participant to call BarrierArriveAndWait(), BarrierDetach() or * BarrierArriveAndDetach(). Return the current phase. |