PCP implementation II
Martin Molnar
m.molnar at sh.cvut.cz
Mon May 22 20:21:24 UTC 2006
Hello,
could anybody explain why the executing task's priority is raised to
ceiling of mutex after the task is inserted into wait queue with
priority discipline? I would expect this to happen when task is taken
out the wait queue since it obtained mutex.
For clarity, I include a code from cpukit/score/src/coremutexseize.c (
_CORE_mutex_Seize_interrupt_blocking function, line 57-74):
_Thread_queue_Enqueue( &the_mutex->Wait_queue, timeout );
if ( _Thread_Executing->Wait.return_code ==
CORE_MUTEX_STATUS_SUCCESSFUL ) {
/*
* if CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT then nothing to do
* because this task is already the highest priority.
*/
if ( _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if (the_mutex->Attributes.priority_ceiling <
executing->current_priority){
_Thread_Change_priority(
executing,
the_mutex->Attributes.priority_ceiling,
FALSE
);
}
}
}
Yes, I understand ,if it is done here It does not have to be done later
when task obtains mutex. But tasks are waiting for mutex in a priority
order. Therefore the following situation can happen: At first, task
with low priority becomes blocked and its priority is raised to ceiling
of mutex. Then, task with higher priority is blocked and is enqueued
behind the task with low original priority whose priority is now higher.
( I presume that both task fall into the same priority header.) Finally,
the task with lower original priority obtains the mutex before the
task with higher original priority. I think it is not a desired behaviour.
Please, let me know if I am not correct.
Thanks.
Martin Molnar
More information about the users
mailing list