D.4 Entry Queuing Policies
This subclause specifies a mechanism
for a user to choose an entry
queuing policy. It also defines
three such policies. Other policies are implementation defined.
Syntax
The form of a
pragma
Queuing_Policy is as follows:
Legality Rules
The
policy_identifier
shall be either FIFO_Queuing, Ordered_FIFO_Queuing, Priority_Queuing
or an implementation-defined
identifier.
Post-Compilation Rules
A Queuing_Policy
pragma is a configuration pragma.
Dynamic Semantics
A
queuing policy governs
the order in which tasks are queued for entry service, and the order
in which different entry queues are considered for service. The queuing
policy is specified by a Queuing_Policy pragma.
Three queuing policies, FIFO_Queuing, Ordered_FIFO_Queuing,
and Priority_Queuing, are language defined. If no Queuing_Policy pragma
applies to any of the program units comprising the partition, the queuing
policy for that partition is FIFO_Queuing.
The rules for the FIFO_Queuing policy are specified in
9.5.3
and
9.7.1.
The Ordered_FIFO_Queuing
policy is defined as follows:
Calls are selected on a given entry queue in order
of arrival.
When more than one condition of an
entry_barrier
of a protected object becomes True, and more than one of the respective
queues is nonempty, the call that arrived first is selected.
When more than one alternative of a
selective_accept
is open and has queued calls, the alternative whose queue has the call
that arrived first is selected.
The Priority_Queuing
policy is defined as follows:
The calls to an entry (including
a member of an entry family) are queued in an order consistent with the
priorities of the calls. The
priority of an entry call is initialized
from the active priority of the calling task at the time the call is
made, but can change later. Within the same priority, the order is consistent
with the calling (or requeuing, or priority setting) time (that is, a
FIFO order).
After a call is first queued, changes to the active
priority of a task do not affect the priority of the call, unless the
base priority of the task is set while the task is blocked on an entry
call.
When the base priority of a task is set (see
D.5),
if the task is blocked on an entry call, and the call is queued, the
priority of the call is updated to the new active priority of the calling
task. This causes the call to be removed from and then reinserted in
the queue at the new active priority.
When more than one
condition
of an
entry_barrier
of a protected object becomes True, and more than one of the respective
queues is nonempty, the call with the highest priority is selected. If
more than one such call has the same priority, the call that is queued
on the entry whose declaration is first in textual order in the
protected_definition
is selected. For members of the same entry family, the one with the lower
family index is selected.
When more than one alternative of a
selective_accept
is open and has queued calls, an alternative whose queue has the highest-priority
call at its head is selected. If two or more open alternatives have equal-priority
queued calls, then a call on the entry in the
accept_alternative
that is first in textual order in the
selective_accept
is selected.
Implementation Permissions
Implementations are allowed to define other queuing
policies, but are not required to support specifying more than one queuing
policy per partition.
Implementations are allowed to defer the reordering
of entry queues following a change of base priority of a task blocked
on the entry call if it is not practical to reorder the queue immediately.
Implementation Advice
The implementation should use names that end with
“_Queuing” for implementation-defined queuing policies.
Static Semantics
Max_Entry_Queue_Length
The type of aspect Max_Entry_Queue_Length is Integer.
If directly specified, the aspect_definition shall be a static expression
no less than -1. If not specified, the aspect has value -1 (representing
no additional restriction on queue length).
Legality Rules
If the Max_Entry_Queue_Length aspect for a type has
a nonnegative value, the Max_Entry_Queue_Length aspect for every individual
entry of that type shall not be greater than the value of the aspect
for the type. The Max_Entry_Queue_Length aspect of a type is nonoverridable
(see
13.1.1).
Post-Compilation Rules
If a restriction Max_Entry_Queue_Length applies to
a partition, any value specified for the Max_Entry_Queue_Length aspect
specified for the declaration of a type or entry in the partition shall
not be greater than the value of the restriction.
Dynamic Semantics
If a nonconfirming value is specified for Max_Entry_Queue_Length
for a type, and an entry call or requeue would cause the queue for any
entry of the type to become longer than the specified value, then Program_Error
is raised at the point of the call or requeue.
If a nonconfirming value is specified for Max_Entry_Queue_Length
for an entry, and an entry call or requeue would cause the queue for
an entry to become longer than the specified value, then Program_Error
is raised at the point of the call or requeue.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe