9.3 Task Dependence - Termination of Tasks
Dynamic Semantics
Each
task (other than an environment task — see
10.2)
depends on one or more masters (see
7.6.1),
as follows:
If the task is created by the evaluation of an
allocator
for a given named access type, it depends on each master that includes
the elaboration of the declaration of the ultimate ancestor of the given
access type.
If the task is created by the elaboration of an
object_declaration,
it depends on each master that includes this elaboration.
Otherwise, the task depends on the master of the
outermost object of which it is a part (as determined by the accessibility
level of that object — see
3.10.2
and
7.6.1), as well as on any master whose
execution includes that of the master of the outermost object.
Furthermore, if a task depends
on a given master, it is defined to depend on the task that executes
the master, and (recursively) on any master of that task.
A task is said to be
completed when the execution
of its corresponding
task_body
is completed. A task is said to be
terminated when any finalization
of the
task_body
has been performed (see
7.6.1). The first
step of finalizing a master (including a
task_body)
is to wait for the termination of any tasks dependent on the master.
The task executing the master is blocked until all
the dependents have terminated. Any remaining finalization is then performed
and the master is left.
The task depends on some completed master; and
When both conditions are satisfied, the task considered
becomes completed, together with all tasks that depend on the master
considered that are not yet completed.
NOTE 1 The full view of a limited
private type can be a task type, or can have subcomponents of a task
type. Creation of an object of such a type creates dependences according
to the full type.
NOTE 3 The rules given for the collective
completion of a group of tasks all blocked on
select_statements
with open
terminate_alternatives
ensure that the collective completion can occur only when there are no
remaining active tasks that can call one of the tasks being collectively
completed.
NOTE 5 The
completion of a task can occur due to any of the following:
the abort of the task.
Examples
Example of task
dependence:
declare
type Global
is access Server; --
see 9.1
A, B : Server;
G : Global;
begin
--
activation of A and B
declare
type Local
is access Server;
X : Global :=
new Server; --
activation of X.all
L : Local :=
new Server; --
activation of L.all
C : Server;
begin
--
activation of C
G := X; --
both G and X designate the same task object
...
end; --
await termination of C and L.all (but not X.all)
...
end; --
await termination of A, B, and G.all
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe