9.7.1 Selective Accept
[This form of the select_statement
allows a combination of waiting for, and selecting from, one or more
alternatives. The selection may depend on conditions associated with
each alternative of the selective_accept
terminate_alternative ::= terminate
These three possibilities are mutually exclusive.
Reason: This simplifies the implementation
and the description of the semantics.
are first considered. Selection of one such alternative takes place immediately
if the corresponding entry already has queued calls. If several alternatives
can thus be selected, one of them is selected according to the entry
queuing policy in effect (see 9.5.3
When such an alternative is selected, the selected call is removed from
its entry queue and the handled_sequence_of_statements
(if any) of the corresponding accept_statement
is executed; after the rendezvous completes any subsequent sequence_of_statements
of the alternative is executed.
If no selection is
immediately possible (in the above sense) and there is no else part,
the task blocks until an open alternative can be selected.
Selection of the other
forms of alternative or of an else part is performed as follows:
In the absence of a requeue_statement
the conditions stated are such that a terminate_alternative
cannot be selected while there is a queued entry call for any entry of
the task. In the presence of requeues from a task to one of its subtasks,
it is possible that when a terminate_alternative
of the subtask is selected, requeued calls (for closed entries only)
might still be queued on some entry of the subtask. Tasking_Error will
be propagated to such callers, as is usual when a task completes while
queued callers remain.
The exception Program_Error is
raised if all alternatives are closed and there is no else part.
Example of a task
body with a selective accept:
task body Server is
Current_Work_Item : Work_Item;
accept Next_Work_Item(WI : in Work_Item) do
Current_Work_Item := WI;
exit; -- Premature shut down requested
terminate; -- Normal shutdown at end of scope
Wording Changes from Ada 83
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe