score: Fix MrsP ISR/task sychronization

This commit is contained in:
Sebastian Huber
2015-03-24 08:29:44 +01:00
parent 4054c91646
commit ad57a59bac

View File

@@ -141,14 +141,14 @@ RTEMS_INLINE_ROUTINE void _MRSP_Timeout(
_ISR_Disable( level );
if ( rival->status == MRSP_WAIT_FOR_OWNERSHIP ) {
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 );
rival->status = MRSP_TIMEOUT;
_Resource_Node_extract( &thread->Resource_node );
_Resource_Node_set_dependency( &thread->Resource_node, NULL );
_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 );
}