summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-03-24 08:29:44 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-03-24 14:35:05 +0100
commitad57a59bace5bb9e0bf542fec5dff03c3947b21f (patch)
treeeab6e183028f5972b29410e898152c92108c9987
parentscore: Add scheduler acquire/release (diff)
downloadrtems-ad57a59bace5bb9e0bf542fec5dff03c3947b21f.tar.bz2
score: Fix MrsP ISR/task sychronization
-rw-r--r--cpukit/score/include/rtems/score/mrspimpl.h21
1 files changed, 12 insertions, 9 deletions
diff --git a/cpukit/score/include/rtems/score/mrspimpl.h b/cpukit/score/include/rtems/score/mrspimpl.h
index dc89b69b39..c1e05e4c96 100644
--- a/cpukit/score/include/rtems/score/mrspimpl.h
+++ b/cpukit/score/include/rtems/score/mrspimpl.h
@@ -141,14 +141,14 @@ RTEMS_INLINE_ROUTINE void _MRSP_Timeout(
_ISR_Disable( level );
if ( rival->status == MRSP_WAIT_FOR_OWNERSHIP ) {
- _Chain_Extract_unprotected( &rival->Node );
-
- _ISR_Enable( level );
-
rival->status = MRSP_TIMEOUT;
+ _Chain_Extract_unprotected( &rival->Node );
_Resource_Node_extract( &thread->Resource_node );
_Resource_Node_set_dependency( &thread->Resource_node, NULL );
+
+ _ISR_Enable( level );
+
_Scheduler_Thread_change_help_state( thread, rival->initial_help_state );
_Scheduler_Thread_change_resource_root( thread, thread );
_MRSP_Restore_priority( thread, rival->initial_priority );
@@ -180,12 +180,13 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Wait_for_ownership(
_MRSP_Elevate_priority( mrsp, executing, ceiling_priority );
_ISR_Disable( level );
- _Chain_Append_unprotected( &mrsp->Rivals, &rival.Node );
- _ISR_Enable( level );
+ _Chain_Append_unprotected( &mrsp->Rivals, &rival.Node );
_Resource_Add_rival( &mrsp->Resource, &executing->Resource_node );
_Resource_Node_set_dependency( &executing->Resource_node, &mrsp->Resource );
+ _ISR_Enable( level );
+
_Scheduler_Thread_change_resource_root(
executing,
THREAD_RESOURCE_NODE_TO_THREAD( _Resource_Node_get_root( owner ) )
@@ -293,11 +294,12 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Release(
return MRSP_INCORRECT_STATE;
}
- _Resource_Extract( &mrsp->Resource );
_MRSP_Restore_priority( executing, mrsp->initial_priority_of_owner );
_ISR_Disable( level );
+ _Resource_Extract( &mrsp->Resource );
+
if ( _Chain_Is_empty( &mrsp->Rivals ) ) {
_ISR_Enable( level );
@@ -313,14 +315,15 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Release(
*/
rival->status = MRSP_SUCCESSFUL;
- _ISR_Enable( level );
-
new_owner = rival->thread;
mrsp->initial_priority_of_owner = rival->initial_priority;
_Resource_Node_extract( &new_owner->Resource_node );
_Resource_Node_set_dependency( &new_owner->Resource_node, NULL );
_Resource_Node_add_resource( &new_owner->Resource_node, &mrsp->Resource );
_Resource_Set_owner( &mrsp->Resource, &new_owner->Resource_node );
+
+ _ISR_Enable( level );
+
_Scheduler_Thread_change_help_state( new_owner, SCHEDULER_HELP_ACTIVE_OWNER );
_Scheduler_Thread_change_resource_root( new_owner, new_owner );
}