9.2 Task Execution - Task Activation
Dynamic Semantics
The execution of a task of a
given task type consists of the execution of the corresponding
task_body.
The
initial part of this execution is called the
activation of the
task; it consists of the elaboration of the
declarative_part
of the
task_body.
Should an exception be propagated by the elaboration
of its
declarative_part,
the activation of the task is defined to have
failed, and it becomes
a completed task.
A task object (which represents one task) can be
a part of a stand-alone object, of an object created by an
allocator,
or of an anonymous object of a limited type, or a coextension of one
of these. All tasks that are part or coextensions of any of the stand-alone
objects created by the elaboration of
object_declarations
(or
generic_associations
of formal objects of mode
in) of a single declarative region are
activated together. All tasks that are part or coextensions of a single
object that is not a stand-alone object are activated together.
For tasks that are part or coextensions of a single
object that is not a stand-alone object, activations are initiated after
completing any initialization of the outermost object enclosing these
tasks, prior to performing any other operation on the outermost object.
In particular, for tasks that are part or coextensions of the object
created by the evaluation of an
allocator,
the activations are initiated as the last step of evaluating the
allocator,
prior to returning the new access value. For tasks that are part or coextensions
of an object that is the result of a function call, the activations are
not initiated until after the function returns.
The task
that created the new tasks and initiated their activations (the
activator)
is blocked until all of these activations complete (successfully or not).
Once all of these activations are complete, if the
activation of any of the tasks has failed (due to the propagation of
an exception), Tasking_Error is raised in the activator, at the place
at which it initiated the activations. Otherwise, the activator proceeds
with its execution normally. Any tasks that are aborted prior to completing
their activation are ignored when determining whether to raise Tasking_Error.
Should the task that created the new tasks never
reach the point where it would initiate the activations (due to an abort
or the raising of an exception), the newly created tasks become terminated
and are never activated.
5 An entry of a task can be called before
the task has been activated.
6 If several tasks are activated together,
the execution of any of these tasks need not await the end of the activation
of the other tasks.
7 A task can become completed during its
activation either because of an exception or because it is aborted (see
9.8).
Examples
Example of task
activation:
procedure P is
A, B : Server; -- elaborate the task objects A, B
C : Server; -- elaborate the task object C
begin
-- the tasks A, B, C are activated together before the first statement
...
end;