mirror of
https://github.com/postgres/postgres.git
synced 2025-10-27 00:12:01 +03:00
Add BarrierArriveAndDetachExceptLast().
Provide a way for one process to continue the remaining phases of a (previously) parallel computation alone. Later patches will use this to extend Parallel Hash Join. Author: Melanie Plageman <melanieplageman@gmail.com> Reviewed-by: Thomas Munro <thomas.munro@gmail.com> Discussion: https://postgr.es/m/CA%2BhUKG%2BA6ftXPz4oe92%2Bx8Er%2BxpGZqto70-Q_ERwRaSyA%3DafNg%40mail.gmail.com
This commit is contained in:
@@ -205,6 +205,28 @@ BarrierArriveAndDetach(Barrier *barrier)
|
||||
return BarrierDetachImpl(barrier, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
@@ -37,6 +37,7 @@ typedef struct Barrier
|
||||
extern void BarrierInit(Barrier *barrier, int num_workers);
|
||||
extern bool BarrierArriveAndWait(Barrier *barrier, uint32 wait_event_info);
|
||||
extern bool BarrierArriveAndDetach(Barrier *barrier);
|
||||
extern bool BarrierArriveAndDetachExceptLast(Barrier *barrier);
|
||||
extern int BarrierAttach(Barrier *barrier);
|
||||
extern bool BarrierDetach(Barrier *barrier);
|
||||
extern int BarrierPhase(Barrier *barrier);
|
||||
|
||||
Reference in New Issue
Block a user