Ada 2012 Reference Manual
D.10.1 Synchronous Barriers
This subclause introduces a language-defined package to synchronously release a group of tasks after the number of blocked tasks reaches a specified count value.
Static Semantics
The following language-defined library package exists:
package Ada.Synchronous_Barriers is
pragma Preelaborate(Synchronous_Barriers);
pragma Preelaborate(Synchronous_Barriers);
subtype Barrier_Limit is Positive range 1 .. implementation-defined;
type Synchronous_Barrier (Release_Threshold : Barrier_Limit) is limited private;
procedure Wait_For_Release (The_Barrier : in out Synchronous_Barrier;
Notified : out Boolean);
Notified : out Boolean);
private
-- not specified by the language
end Ada.Synchronous_Barriers;
-- not specified by the language
end Ada.Synchronous_Barriers;
Type Synchronous_Barrier needs finalization (see 7.6).
Dynamic Semantics
Each call to Wait_For_Release blocks the calling task until the number of blocked tasks associated with the Synchronous_Barrier object is equal to Release_Threshold, at which time all blocked tasks are released. Notified is set to True for one of the released tasks, and set to False for all other released tasks.
The mechanism for determining which task sets Notified to True is implementation defined.
Once all tasks have been released, a Synchronous_Barrier object may be reused to block another Release_Threshold number of tasks.
As the first step of the finalization of a Synchronous_Barrier, each blocked task is unblocked and Program_Error is raised at the place of the call to Wait_For_Release.
It is implementation defined whether an abnormal task which is waiting on a Synchronous_Barrier object is aborted immediately or aborted when the tasks waiting on the object are released.
Wait_For_Release is a potentially blocking operation (see 9.5.1).
Bounded (Run-Time) Errors
It is a bounded error to call Wait_For_Release on a Synchronous_Barrier object after that object is finalized. If the error is detected, Program_Error is raised. Otherwise, the call proceeds normally, which may leave a task blocked forever.