summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems/score/mrspimpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/include/rtems/score/mrspimpl.h')
-rw-r--r--cpukit/score/include/rtems/score/mrspimpl.h32
1 files changed, 20 insertions, 12 deletions
diff --git a/cpukit/score/include/rtems/score/mrspimpl.h b/cpukit/score/include/rtems/score/mrspimpl.h
index 5efb619d0b..6aa45a8c4f 100644
--- a/cpukit/score/include/rtems/score/mrspimpl.h
+++ b/cpukit/score/include/rtems/score/mrspimpl.h
@@ -102,6 +102,7 @@ RTEMS_INLINE_ROUTINE void _MRSP_Claim_ownership(
_Resource_Set_owner( &mrsp->Resource, &new_owner->Resource_node );
mrsp->initial_priority_of_owner = initial_priority;
_MRSP_Elevate_priority( mrsp, new_owner, ceiling_priority );
+ _Scheduler_Thread_change_help_state( new_owner, SCHEDULER_HELP_ACTIVE_OWNER );
}
RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Initialize(
@@ -185,6 +186,7 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Wait_for_ownership(
MRSP_Rival rival;
bool previous_life_protection;
unsigned int state;
+ Scheduler_Help_state previous_help_state;
_MRSP_Elevate_priority( mrsp, executing, ceiling_priority );
@@ -193,6 +195,8 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Wait_for_ownership(
_Chain_Append_unprotected( &mrsp->Rivals, &rival.Node );
_Resource_Add_rival( &mrsp->Resource, &executing->Resource_node );
_Resource_Node_set_dependency( &executing->Resource_node, &mrsp->Resource );
+ previous_help_state =
+ _Scheduler_Thread_change_help_state( executing, SCHEDULER_HELP_ACTIVE_RIVAL );
_MRSP_Set_root(
&executing->Resource_node,
_Resource_Node_get_root( owner )
@@ -234,11 +238,10 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Wait_for_ownership(
mrsp->initial_priority_of_owner = initial_priority;
status = MRSP_SUCCESSFUL;
} else {
- Resource_Node *executing_node = &executing->Resource_node;
-
- _Resource_Node_extract( executing_node );
- _Resource_Node_set_dependency( executing_node, NULL );
- _MRSP_Set_root( executing_node, executing_node );
+ _Resource_Node_extract( &executing->Resource_node );
+ _Resource_Node_set_dependency( &executing->Resource_node, NULL );
+ _Scheduler_Thread_change_help_state( executing, previous_help_state );
+ _MRSP_Set_root( &executing->Resource_node, &executing->Resource_node );
_MRSP_Restore_priority( mrsp, executing, initial_priority );
status = MRSP_TIMEOUT;
@@ -324,16 +327,21 @@ RTEMS_INLINE_ROUTINE MRSP_Status _MRSP_Release(
_Resource_Set_owner( &mrsp->Resource, NULL );
} else {
MRSP_Rival *rival = (MRSP_Rival *) _Chain_First( &mrsp->Rivals );
- Resource_Node *new_owner = &rival->thread->Resource_node;
-
- _Resource_Node_extract( new_owner );
- _Resource_Node_set_dependency( new_owner, NULL );
- _Resource_Node_add_resource( new_owner, &mrsp->Resource );
- _Resource_Set_owner( &mrsp->Resource, new_owner );
- _MRSP_Set_root( new_owner, new_owner );
+ Thread_Control *new_owner = rival->thread;
+
+ _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 );
+ _Scheduler_Thread_change_help_state( new_owner, SCHEDULER_HELP_ACTIVE_OWNER );
+ _MRSP_Set_root( &new_owner->Resource_node, &new_owner->Resource_node );
_MRSP_Add_state( rival, MRSP_RIVAL_STATE_NEW_OWNER );
}
+ if ( !_Resource_Node_owns_resources( &executing->Resource_node ) ) {
+ _Scheduler_Thread_change_help_state( executing, SCHEDULER_HELP_YOURSELF );
+ }
+
return MRSP_SUCCESSFUL;
}