Go to the first, previous, next, last section, table of contents.
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 created either as part
of the elaboration of an object_declaration occurring immediately within
some declarative region, or as part of the evaluation of an allocator.
All tasks created by the elaboration of object_declarations of a single
declarative region (including subcomponents of the declared objects) are
activated together. Similarly, all tasks created by the evaluation of a
single allocator are activated together. The activation of a task is
associated with the innermost allocator or object_declaration that is
responsible for its creation.
-
For tasks created by the elaboration of object_declarations of a given
declarative region, the activations are initiated within the context of
the handled_sequence_of_statements (and its associated
exception_handlers if any -- See section 11.2 Exception Handlers, just prior to executing the
statements of the _sequence. 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 See section 7.2 Package Bodies.
-
For tasks created by the evaluation of an allocator, the activations are
initiated as the last step of evaluating the allocator, after completing
any initialization for the object created by the allocator, and prior to
returning the new access value.
-
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.
NOTES
-
(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 section 9.8 Abort of a Task - Abort of a Sequence of Statements.
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;
Go to the first, previous, next, last section, table of contents.