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