diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-08-19 17:43:36 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-08-20 07:24:16 +0200 |
commit | a62a3c32b1788f8d1dd318b5e36acc1cf16daf69 (patch) | |
tree | f6544536cfc0655e9143b71966bf0fe51c1f1f21 /cpukit/score/src | |
parent | ramdisk: Fix device name generation (diff) | |
download | rtems-a62a3c32b1788f8d1dd318b5e36acc1cf16daf69.tar.bz2 |
score: PR2179: Fix initially locked PI mutex
Diffstat (limited to 'cpukit/score/src')
-rw-r--r-- | cpukit/score/src/coremutex.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/cpukit/score/src/coremutex.c b/cpukit/score/src/coremutex.c index 9745f82b7e..261e18e80f 100644 --- a/cpukit/score/src/coremutex.c +++ b/cpukit/score/src/coremutex.c @@ -59,14 +59,19 @@ CORE_mutex_Status _CORE_mutex_Initialize( the_mutex->blocked_count = 0; if ( initial_lock == CORE_MUTEX_LOCKED ) { + bool is_priority_ceiling = + _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ); + the_mutex->nest_count = 1; the_mutex->holder = _Thread_Executing; the_mutex->holder_id = _Thread_Executing->Object.id; - if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || - _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { + + if ( is_priority_ceiling || + _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ) { Priority_Control ceiling = the_mutex->Attributes.priority_ceiling; - if ( _Thread_Executing->current_priority < ceiling ) + if ( is_priority_ceiling && + _Thread_Executing->current_priority < ceiling ) return CORE_MUTEX_STATUS_CEILING_VIOLATED; #ifdef __RTEMS_STRICT_ORDER_MUTEX__ _Chain_Prepend_unprotected( &_Thread_Executing->lock_mutex, @@ -75,7 +80,8 @@ CORE_mutex_Status _CORE_mutex_Initialize( #endif _Thread_Executing->resource_count++; - _Thread_Change_priority( _Thread_Executing, ceiling, false ); + if ( is_priority_ceiling ) + _Thread_Change_priority( _Thread_Executing, ceiling, false ); } } else { the_mutex->nest_count = 0; |