#2179 closed defect (fixed)

Initially locked Priority Ceiling semaphores do not elevate the priority of the creating task

Reported by: Sebastian Huber Owned by: Joel Sherrill
Priority: normal Milestone: 4.11
Component: score Version: 4.11
Severity: normal Keywords:
Cc: Blocked By:
Blocking:

Description

You can create a Classic API semaphore using the Priority Ceiling Protocol which is initially locked by the creating task. In this case the creating task is not elevated to the ceiling priority:

CORE_mutex_Status _CORE_mutex_Initialize(

CORE_mutex_Control *the_mutex,
Thread_Control *executing,
const CORE_mutex_Attributes *the_mutex_attributes,
bool initially_locked

)
{

/* Add this to the RTEMS environment later ?????????

rtems_assert( initial_lock == CORE_MUTEX_LOCKED

initial_lock == CORE_MUTEX_UNLOCKED );

*/

the_mutex->Attributes = *the_mutex_attributes;

if ( initially_locked ) {

the_mutex->nest_count = 1;
the_mutex->holder = executing;

if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes )

_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {

if ( executing->current_priority <

the_mutex->Attributes.priority_ceiling )

return CORE_MUTEX_STATUS_CEILING_VIOLATED;

#ifdef RTEMS_STRICT_ORDER_MUTEX

_Chain_Prepend_unprotected( &executing->lock_mutex,

&the_mutex->queue.lock_queue );

the_mutex->queue.priority_before = executing->current_priority;

#endif

executing->resource_count++;

}

} else {

the_mutex->nest_count = 0;
the_mutex->holder = NULL;

}

_Thread_queue_Initialize(

&the_mutex->Wait_queue,
_CORE_mutex_Is_fifo( the_mutex_attributes ) ?

THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,

STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT

);

return CORE_MUTEX_STATUS_SUCCESSFUL;

}

Change History (2)

comment:1 Changed on May 26, 2014 at 9:45:23 AM by Sebastian Huber

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.