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
with Preelaborate, Nonblocking, Global =>
in out synchronized is
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)
with Nonblocking => False;
private
-- 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.
This paragraph was
deleted.
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.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe