diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2001-08-30 18:32:12 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2001-08-30 18:32:12 +0000 |
commit | 6f1118a0c53cca28c85318ced92be4a6f1fa07a4 (patch) | |
tree | 736405a43568738ac4d7685cb8f0e2a53fdb9809 /c | |
parent | 2001-08-30 Joel Sherrill <joel@OARcorp.com> (diff) | |
download | rtems-6f1118a0c53cca28c85318ced92be4a6f1fa07a4.tar.bz2 |
2001-08-30 Joel Sherrill <joel@OARcorp.com>
* src/coremutex.c, src/coremutexseize.c, src/coremutexsurrender.c:
The per thread field resource_count should only be manipulated
when a mutex is priority ceiling or priority inherit. This
was reported by Chris Johns <ccj@acm.org> who also noticed that
the use of switches for all disciplines generated less efficient
code than using explicit tests for the one or two cases we were
really interested in. Further review of his modifications made
it apparent that the "isa" methods to test mutex discipline were
not being used so this modification was swept into the code as well.
Diffstat (limited to 'c')
-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) |