2001-08-30 Joel Sherrill <joel@OARcorp.com>

*  src/coremutex.c, src/coremutexseize.c, src/coremutexsurrender.c,
	inline/rtems/score/coremutex.inl: 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.
This commit is contained in:
Joel Sherrill
2001-08-30 18:33:57 +00:00
parent 760045f0f3
commit fb1d8f81a0
10 changed files with 152 additions and 104 deletions

View File

@@ -1,4 +1,17 @@
2001-08-30 Joel Sherrill <joel@OARcorp.com>
* src/coremutex.c, src/coremutexseize.c, src/coremutexsurrender.c,
inline/rtems/score/coremutex.inl: 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.
2001-08-30 Joel Sherrill <joel@OARcorp.com>
* src/coremutexseize.c: Add missing code for proper handling

View File

@@ -134,9 +134,10 @@ RTEMS_INLINE_ROUTINE int _CORE_mutex_Seize_interrupt_trylock(
the_mutex->holder = executing;
the_mutex->holder_id = executing->Object.id;
the_mutex->nest_count = 1;
executing->resource_count++;
if ( the_mutex->Attributes.discipline !=
CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING ) {
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) )
executing->resource_count++;
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( level );
return 0;
}

View File

@@ -73,7 +73,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;

View File

@@ -43,41 +43,33 @@ void _CORE_mutex_Seize_interrupt_blocking(
Thread_Control *executing;
executing = _Thread_Executing;
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
);
}
}
the_mutex->blocked_count++;
_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_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
);
}
}
}
_Thread_Enable_dispatch();
@@ -101,11 +93,13 @@ int _CORE_mutex_Seize_interrupt_trylock(
the_mutex->holder = executing;
the_mutex->holder_id = executing->Object.id;
the_mutex->nest_count = 1;
executing->resource_count++;
if ( the_mutex->Attributes.discipline !=
CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING ) {
_ISR_Enable( level );
return 0;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) )
executing->resource_count++;
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( level );
return 0;
}
/* else must be CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING */
{
@@ -139,6 +133,22 @@ int _CORE_mutex_Seize_interrupt_trylock(
}
return 0;
}
if ( _Thread_Is_executing( the_mutex->holder ) ) {
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
_ISR_Enable( level );
return 0;
case CORE_MUTEX_NESTING_IS_ERROR:
executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED;
_ISR_Enable( level );
return 0;
case CORE_MUTEX_NESTING_BLOCKS:
break;
}
}
return 1;
}
#endif

View File

@@ -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)
@@ -127,7 +123,9 @@ CORE_mutex_Status _CORE_mutex_Surrender(
the_mutex->holder = the_thread;
the_mutex->holder_id = the_thread->Object.id;
the_thread->resource_count++;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) )
the_thread->resource_count++;
the_mutex->nest_count = 1;
/*

View File

@@ -1,4 +1,17 @@
2001-08-30 Joel Sherrill <joel@OARcorp.com>
* src/coremutex.c, src/coremutexseize.c, src/coremutexsurrender.c,
inline/rtems/score/coremutex.inl: 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.
2001-08-30 Joel Sherrill <joel@OARcorp.com>
* src/coremutexseize.c: Add missing code for proper handling

View File

@@ -134,9 +134,10 @@ RTEMS_INLINE_ROUTINE int _CORE_mutex_Seize_interrupt_trylock(
the_mutex->holder = executing;
the_mutex->holder_id = executing->Object.id;
the_mutex->nest_count = 1;
executing->resource_count++;
if ( the_mutex->Attributes.discipline !=
CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING ) {
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) )
executing->resource_count++;
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( level );
return 0;
}

View File

@@ -73,7 +73,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;

View File

@@ -43,41 +43,33 @@ void _CORE_mutex_Seize_interrupt_blocking(
Thread_Control *executing;
executing = _Thread_Executing;
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
);
}
}
the_mutex->blocked_count++;
_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_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
);
}
}
}
_Thread_Enable_dispatch();
@@ -101,11 +93,13 @@ int _CORE_mutex_Seize_interrupt_trylock(
the_mutex->holder = executing;
the_mutex->holder_id = executing->Object.id;
the_mutex->nest_count = 1;
executing->resource_count++;
if ( the_mutex->Attributes.discipline !=
CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING ) {
_ISR_Enable( level );
return 0;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) )
executing->resource_count++;
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( level );
return 0;
}
/* else must be CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING */
{
@@ -139,6 +133,22 @@ int _CORE_mutex_Seize_interrupt_trylock(
}
return 0;
}
if ( _Thread_Is_executing( the_mutex->holder ) ) {
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
_ISR_Enable( level );
return 0;
case CORE_MUTEX_NESTING_IS_ERROR:
executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED;
_ISR_Enable( level );
return 0;
case CORE_MUTEX_NESTING_BLOCKS:
break;
}
}
return 1;
}
#endif

View File

@@ -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)
@@ -127,7 +123,9 @@ CORE_mutex_Status _CORE_mutex_Surrender(
the_mutex->holder = the_thread;
the_mutex->holder_id = the_thread->Object.id;
the_thread->resource_count++;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) )
the_thread->resource_count++;
the_mutex->nest_count = 1;
/*