D.2.4 Non-Preemptive Dispatching
This clause defines a non-preemptive task dispatching
Non_Preemptive_FIFO_Within_Priorities is a task dispatching policy.
Non_Preemptive_FIFO_Within_Priorities shall not be
specified as the policy_identifier
Priority_Specific_Dispatching (see D.2.2
When Non_Preemptive_FIFO_Within_Priorities is in
effect, modifications to the ready queues occur only as follows:
- When a blocked task becomes ready,
it is added at the tail of the ready queue for its active priority.
- When the active priority of a ready
task that is not running changes, or the setting of its base priority
takes effect, the task is removed from the ready queue for its old active
priority and is added at the tail of the ready queue for its new active
- When the setting of the base priority
of a running task takes effect, the task is added to the tail of the
ready queue for its active priority.
- When a task executes a delay_statement
that does not result in blocking, it is added to the tail of the ready
queue for its active priority.
For this policy, a non-blocking delay_statement
is the only non-blocking event that is a task dispatching point (see
An implementation shall allow, for a single partition,
both the task dispatching policy to be specified as Non_Preemptive_FIFO_Within_Priorities
and also the locking policy (see D.3
) to be
specified as Ceiling_Locking.
Since implementations are allowed to round all ceiling
priorities in subrange System.Priority to System.Priority'Last (see D.3
an implementation may allow a task to execute within a protected object
without raising its active priority provided the associated protected
unit does not contain pragma Interrupt_Priority, Interrupt_Handler, or