9.7.1 Selective Accept
1
[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. 
]
Syntax
2
3
4
5
6
7
terminate_alternative ::= terminate;
 
8
9
10
11
12
These three possibilities are mutually exclusive. 
Legality Rules
13
13.a
Reason: This simplifies the implementation 
and the description of the semantics. 
Dynamic Semantics
14
15
16
Open 
accept_alternatives 
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 and 
D.4). 
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.
17
Selection of the other 
forms of alternative or of an else part is performed as follows: 
18
19
20
20.a
Ramification: 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. 
 
21
The exception Program_Error is 
raised if all alternatives are closed and there is no else part.
22
Examples
23
Example of a task 
body with a selective accept: 
24
task body Server is
   Current_Work_Item : Work_Item;
begin
   loop
      select
         accept Next_Work_Item(WI : in Work_Item) do
            Current_Work_Item := WI;
          end;
          Process_Work_Item(Current_Work_Item);
      or
         accept Shut_Down;
         exit;       -- Premature shut down requested
      or
         terminate;  -- Normal shutdown at end of scope
      end select;
   end loop;
end Server;
Wording Changes from Ada 83
24.a
 Ada 2005 and 2012 Editions sponsored in part by Ada-Europe
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe