Ada Reference Manual (Ada 2022)Legal Information
Contents   Index   References   Search   Previous   Next 

9.7.4 Asynchronous Transfer of Control

1
An asynchronous select_statement provides asynchronous transfer of control upon completion of an entry call or the expiration of a delay. 

Syntax

2
asynchronous_select ::= 
  select
   triggering_alternative
  then abort
   abortable_part
  end select;
3
triggering_alternative ::= triggering_statement [sequence_of_statements]
4/2
triggering_statement ::= procedure_or_entry_call | delay_statement
5
abortable_part ::= sequence_of_statements

Dynamic Semantics

6/2
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.
7
For the execution of an asynchronous_select whose triggering_statement is a delay_statement, the delay_expression is evaluated and the expiration time is determined, as for a normal delay_statement. If the expiration time has not already passed, the abortable_part is executed.
8
If the abortable_part completes and is left prior to completion of the triggering_statement, an attempt to cancel the triggering_statement is made. If the attempt to cancel succeeds (see 9.5.3 and 9.6), the asynchronous_select is complete.
9
If the triggering_statement completes other than due to cancellation, the abortable_part is aborted (if started but not yet completed — see 9.8). If the triggering_statement completes normally, the optional sequence_of_statements of the triggering_alternative is executed after the abortable_part is left. 

Examples

10
Example of a main command loop for a command interpreter: 
11
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;
12
Example of a time-limited calculation:
13/5
select
   delay 5.0;
   Put_Line("Calculation does not converge");
then abort
   -- This calculation is expected to finish in 5.0 seconds;
   --  if not, it is assumed to diverge.
   Horribly_Complicated_Recursive_Function(X, Y);
end select;
14/5
Note that these examples presume that there are abort completion points (see 9.8) within the execution of the abortable_part.

Contents   Index   References   Search   Previous   Next 
Ada-Europe Ada 2005 and 2012 Editions sponsored in part by Ada-Europe