Contents   Index   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
triggering_statement
::= entry_call_statement | 
delay_statement 
5
abortable_part
::= sequence_of_statements 
Dynamic Semantics
6
   For the execution of an 
asynchronous_select
whose 
triggering_statement is an
entry_call_statement, the 
entry_name
and actual parameters are evaluated as for a simple entry call (see 
9.5.3),
and 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.
 
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
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;
Contents   Index   Search   Previous   Next   Legal