Next: , Previous: 9.7.3, Up: 9.7


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 (see 9.7.4) 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 (see 5.1) of the triggering_alternative (see 9.7.4); the abortable_part is never started.

7
For the execution of an asynchronous_select whose triggering_statement (see 9.7.4) 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 (see 9.7.4), an attempt to cancel the triggering_statement (see 9.7.4) 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 (see 9.7.4) completes other than due to cancellation, the abortable_part is aborted (if started but not yet completed −− see 9.8). If the triggering_statement (see 9.7.4) completes normally, the optional sequence_of_statements (see 5.1) of the triggering_alternative (see 9.7.4) 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;