9.2 Task Execution - Task Activation
The execution of a task of a
given task type consists of the execution of the corresponding task_body
initial part of this execution is called the activation
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_declaration
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.
task that created the new tasks and initiated their activations (the
) 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
If the master that directly encloses the point where
the activation of a task T would be initiated, completes before
the activation of T is initiated, T becomes terminated
and is never activated. Furthermore, if a return statement is left such
that the return object is not returned to the caller, any task that was
created as a part of the return object or one of its coextensions immediately
becomes terminated and is never activated.
NOTE 1 An entry of a task can be
called before the task has been activated.
NOTE 2 If several tasks are activated
together, the execution of any of these tasks can proceed without waiting
until the end of the activation of the other tasks.
NOTE 3 A task can become completed
during its activation either because of an exception or because it is
aborted (see 9.8
Example of task
procedure P is
A, B : Server; -- elaborate the task objects A, B
C : Server; -- elaborate the task object C
-- the tasks A, B, C are activated together before the first statement
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe