- (1)
- An asynchronous select_statement provides asynchronous transfer of
control upon completion of an entry call or the expiration of a delay.
(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;
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12