C.7.1 The Package Task_Identification
The following language-defined
library package exists:
Preelaborate, Nonblocking, Global => in out synchronized is(Task_Identification);
Task_Id is private;
Null_Task_Id : constant
"=" (Left, Right : Task_Id) return
Image (T : Task_Id) return
Abort_Task (T : in
with Nonblocking => False
Is_Terminated (T : Task_Id) return
Is_Callable (T : Task_Id) return
Activation_Is_Complete (T : Task_Id) return
... -- not specified by the language
A value of the type Task_Id identifies an existent
task. The constant Null_Task_Id does not identify any task. Each object
of the type Task_Id is default initialized to the value of Null_Task_Id.
The function "=" returns True if and only
if Left and Right identify the same task or both have the value Null_Task_Id.
The function Image returns an implementation-defined
string that identifies T. If T equals Null_Task_Id, Image returns an
Implementation defined: The result of
the Task_Identification.Image attribute.
The function Current_Task returns a value that identifies
the calling task.
The logical threads of control associated with
the execution of a given parallel construct all execute as part of the
execution of one task (see 9, “Tasks
and Synchronization”). Thus, the result returned by a call
to Task_Identification.Current_Task is independent of whether the call
takes place during the execution of a parallel construct.
The function Environment_Task returns a value that identifies the environment
The effect of Abort_Task is the same as the abort_statement
for the task identified by T. [In addition, if T identifies the environment
task, the entire partition is aborted, See E.1
The functions Is_Terminated and Is_Callable return
the value of the corresponding attribute of the task identified by T.
These routines can be called with an argument identifying the environment
task. Is_Terminated will always be False for such a call, but Is_Callable
(usually True) could be False if the environment task is waiting for
the termination of dependent tasks. Thus, a dependent task can use Is_Callable
to determine if the main subprogram has completed.
The function Activation_Is_Complete returns True if the task identified
by T has completed its activation (whether successfully or not). It returns
False otherwise. If T identifies the environment task, Activation_Is_Complete
returns True after the elaboration of the library_item
of the partition has completed.
For a prefix
T that is of a task type [(after any implicit dereference)], the following
attribute is defined:
Yields a value of the type Task_Id
that identifies the task denoted by T.
Yields a value of the type Task_Id that identifies the task whose call
is now being serviced. Use of this attribute is allowed only inside an
after the entry_barrier
corresponding to the entry_declaration
denoted by E.
Program_Error is raised if a value of Null_Task_Id is passed as a parameter
to Abort_Task, Activation_Is_Complete,
This paragraph was
is a potentially blocking operation (see 9.5.1).
Bounded (Run-Time) Errors
It is a bounded error to call the Current_Task function
from an entry_body
interrupt handler, or finalization of a task attribute. Program_Error
is raised, or an implementation-defined value of the type Task_Id is
Implementation defined: The value of
Current_Task when in a protected entry, interrupt handler, or finalization
of a task attribute.
Implementation Note: This value could
be Null_Task_Id, or the ID of some user task, or that of an internal
task created by the implementation.
An entry barrier is syntactically part of an entry_body
so a call to Current_Task from an entry barrier is also covered by this
If a value of Task_Id is passed
as a parameter to any of the operations declared in this package (or
any language-defined child of this package), and the corresponding task
object no longer exists, the execution of the program is erroneous.
The implementation shall document the effect of calling
Current_Task from an entry body or interrupt handler.
Documentation Requirement: The effect
of calling Current_Task from an entry body or interrupt handler.
NOTE 1 This package is intended for
use in writing user-defined task scheduling packages and constructing
server tasks. Current_Task can be used in conjunction with other operations
requiring a task as an argument such as Set_Priority (see D.5
NOTE 2 The function Current_Task
and the attribute Caller can return a Task_Id value that identifies the
Extensions to Ada 95
Task_Identification is now preelaborated, so it can be used in preelaborated
Wording Changes from Ada 95
Corrected the wording to include finalization of a task attribute in
the bounded error case; we don't want to specify which task does these
Incompatibilities With Ada 2005
Functions Environment_Task and Activation_Is_Complete
are added to Task_Identification. If Task_Identification is referenced
in a use_clause
and an entity E
with a defining_identifier
of Environment_Task or Activation_Is_Complete is defined in a package
that is also referenced in a use_clause
the entity E
may no longer be use-visible, resulting in errors.
This should be rare and is easily fixed if it does occur.
Wording Changes from Ada 2012
Correction: Defined what happens if Null_Task_Id
is passed to Activation_Is_Complete.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe