9.2 Task Execution - Task Activation
This Reference Manual output has not been verified, and may contain omissions or errors. Report any problems on the tracking issue
Dynamic Semantics
1The 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_declaration
s (or generic_association
s 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.
object_declaration
or allocator
can indirectly include the creation of other objects that contain tasks. For example, the default expression for a subcomponent of an object created by an allocator
might call a function that evaluates a completely different allocator
. Tasks created by the two allocators are not activated together. For the tasks of a given declarative region, the activations are initiated within the context of the handled_sequence_of_statements
(and its associated exception_handler
s if any — see 11.2), just prior to executing the statements of the handled_sequence_of_statements
. [For a package without an explicit body or an explicit handled_sequence_of_statements
, an implicit body or an implicit null_statement
is assumed, as defined in 7.2.]
handled_sequence_of_statements
. 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.
allocator
does not necessarily depend on its activator; in such a case the activator's termination can precede the termination of the newly created task. 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.
extended_return_statement
, or by a return statement being aborted. Any tasks created for the return object of such a return statement are never activated. Examples
10Example 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;