diff options
-rw-r--r-- | c/src/exec/score/src/coremutex.c | 4 | ||||
-rw-r--r-- | c/src/exec/score/src/coremutexseize.c | 81 | ||||
-rw-r--r-- | c/src/exec/score/src/coremutexsurrender.c | 22 |
3 files changed, 43 insertions, 64 deletions
diff --git a/c/src/exec/score/src/coremutex.c b/c/src/exec/score/src/coremutex.c index a5842efb91..1a15dfb602 100644 --- a/c/src/exec/score/src/coremutex.c +++ b/c/src/exec/score/src/coremutex.c @@ -72,7 +72,9 @@ void _CORE_mutex_Initialize( the_mutex->nest_count = 1; the_mutex->holder = _Thread_Executing; the_mutex->holder_id = _Thread_Executing->Object.id; - _Thread_Executing->resource_count++; + if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || + _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) + _Thread_Executing->resource_count++; } else { the_mutex->nest_count = 0; the_mutex->holder = NULL; diff --git a/c/src/exec/score/src/coremutexseize.c b/c/src/exec/score/src/coremutexseize.c index db576c6ef1..daa5849d8c 100644 --- a/c/src/exec/score/src/coremutexseize.c +++ b/c/src/exec/score/src/coremutexseize.c @@ -53,17 +53,11 @@ void _CORE_mutex_Seize( ISR_Level level; executing = _Thread_Executing; - switch ( the_mutex->Attributes.discipline ) { - case CORE_MUTEX_DISCIPLINES_FIFO: - case CORE_MUTEX_DISCIPLINES_PRIORITY: - case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: - break; - case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: - if ( executing->current_priority < - the_mutex->Attributes.priority_ceiling) { - executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; - return; - } + if ( _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { + if ( executing->current_priority < the_mutex->Attributes.priority_ceiling) { + executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; + return; + } } executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; _ISR_Disable( level ); @@ -72,17 +66,17 @@ void _CORE_mutex_Seize( the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; - executing->resource_count++; + if ( _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) || + _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ) + executing->resource_count++; _ISR_Enable( level ); - switch ( the_mutex->Attributes.discipline ) { - case CORE_MUTEX_DISCIPLINES_FIFO: - case CORE_MUTEX_DISCIPLINES_PRIORITY: - case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: - /* already the highest priority */ - break; - case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: - if ( the_mutex->Attributes.priority_ceiling < - executing->current_priority ) { + /* + * 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( the_mutex->holder, the_mutex->Attributes.priority_ceiling, @@ -120,40 +114,27 @@ void _CORE_mutex_Seize( executing->Wait.id = id; _ISR_Enable( level ); - switch ( the_mutex->Attributes.discipline ) { - case CORE_MUTEX_DISCIPLINES_FIFO: - case CORE_MUTEX_DISCIPLINES_PRIORITY: - case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: - break; - case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: - if ( the_mutex->holder->current_priority > executing->current_priority ) { - _Thread_Change_priority( - the_mutex->holder, - executing->current_priority, - FALSE - ); - } - break; + if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ) { + if ( the_mutex->holder->current_priority > executing->current_priority ) { + _Thread_Change_priority( + the_mutex->holder, + executing->current_priority, + FALSE + ); + } } _Thread_queue_Enqueue( &the_mutex->Wait_queue, timeout ); if ( _Thread_Executing->Wait.return_code == CORE_MUTEX_STATUS_SUCCESSFUL ) { - switch ( the_mutex->Attributes.discipline ) { - case CORE_MUTEX_DISCIPLINES_FIFO: - case CORE_MUTEX_DISCIPLINES_PRIORITY: - case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: - break; - case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: - if ( the_mutex->Attributes.priority_ceiling < - executing->current_priority ) { - _Thread_Change_priority( - executing, - the_mutex->Attributes.priority_ceiling, - FALSE - ); - }; - break; + 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 + ); + } } } } diff --git a/c/src/exec/score/src/coremutexsurrender.c b/c/src/exec/score/src/coremutexsurrender.c index c4dda7e3a7..badc2617f6 100644 --- a/c/src/exec/score/src/coremutexsurrender.c +++ b/c/src/exec/score/src/coremutexsurrender.c @@ -86,7 +86,9 @@ CORE_mutex_Status _CORE_mutex_Surrender( } } - holder->resource_count--; + if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || + _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) + holder->resource_count--; the_mutex->holder = NULL; the_mutex->holder_id = 0; @@ -96,20 +98,14 @@ CORE_mutex_Status _CORE_mutex_Surrender( * mutex (i.e. resource) this task has. */ - switch ( the_mutex->Attributes.discipline ) { - case CORE_MUTEX_DISCIPLINES_FIFO: - case CORE_MUTEX_DISCIPLINES_PRIORITY: - break; - case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: - case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: - if ( holder->resource_count == 0 && - holder->real_priority != holder->current_priority ) { - _Thread_Change_priority( holder, holder->real_priority, TRUE ); - } - break; + if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || + _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { + if ( holder->resource_count == 0 && + holder->real_priority != holder->current_priority ) { + _Thread_Change_priority( holder, holder->real_priority, TRUE ); + } } - if ( ( the_thread = _Thread_queue_Dequeue( &the_mutex->Wait_queue ) ) ) { #if defined(RTEMS_MULTIPROCESSING) |