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. 
 
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. 
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;
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe