9.7.4 Asynchronous Transfer of Control
An asynchronous 
select_statement 
provides asynchronous transfer of control upon completion of an entry 
call or the expiration of a delay. 
 
Syntax
Dynamic Semantics
For the execution 
of an 
asynchronous_select 
whose 
triggering_statement 
is a 
procedure_or_entry_call, 
the 
entry_name, 
procedure_name, 
or 
procedure_prefix, 
and actual parameters are evaluated as for a simple entry call (see 
9.5.3) 
or procedure call (see 
6.4). If the call is 
an entry call or a call on a procedure implemented by an entry, the entry 
call is issued. If the entry call is queued (or requeued-with-abort), 
then the 
abortable_part 
is executed. If the entry call is selected immediately, and never requeued-with-abort, 
then the 
abortable_part 
is never started. If the call is on a procedure that is not implemented 
by an entry, the call proceeds as described in 
6.4, 
followed by the 
sequence_of_statements 
of the 
triggering_alternative; 
the 
abortable_part 
is never started.
 
Examples
Example 
of a main command loop for a command interpreter:  
loop
   select
      Terminal.Wait_For_Interrupt;
      Put_Line("Interrupted");
   then abort
      -- This will be abandoned upon terminal interrupt
      Put_Line("-> ");
      Get_Line(Command, Last);
      Process_Command(Command(1..Last));
   end select;
end loop;
Example of a 
time-limited calculation:  
select
   delay 5.0;
   Put_Line("Calculation does not converge");
then abort
   -- This calculation should finish in 5.0 seconds;
   --  if not, it is assumed to diverge.
   Horribly_Complicated_Recursive_Function(X, Y);
end select;
 Note that these examples presume that there are 
abort completion points within the execution of the 
abortable_part. 
 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe