From ad57a59bace5bb9e0bf542fec5dff03c3947b21f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 24 Mar 2015 08:29:44 +0100 Subject: score: Fix MrsP ISR/task sychronization --- cpukit/score/include/rtems/score/mrspimpl.h | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'cpukit') 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 ); } -- cgit v1.2.3