Prev | Up | ____ | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help


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;

Prev | Up | ____ | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help

Ada WWW Home -- Email comments, additions, corrections, gripes, kudos, etc. to:

Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12