summaryrefslogtreecommitdiffstats
path: root/c/src/exec/score/src/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/exec/score/src/thread.c')
-rw-r--r--c/src/exec/score/src/thread.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/c/src/exec/score/src/thread.c b/c/src/exec/score/src/thread.c
index 517b0a077a..18984b6d9a 100644
--- a/c/src/exec/score/src/thread.c
+++ b/c/src/exec/score/src/thread.c
@@ -1206,6 +1206,7 @@ void _Thread_Delay_ended(
* Input parameters:
* the_thread - pointer to thread control block
* new_priority - ultimate priority
+ * prepend_it - TRUE if the thread should be prepended to the chain
*
* Output parameters: NONE
*
@@ -1216,11 +1217,35 @@ void _Thread_Delay_ended(
void _Thread_Change_priority(
Thread_Control *the_thread,
- Priority_Control new_priority
+ Priority_Control new_priority,
+ boolean prepend_it
)
{
ISR_Level level;
+ /* boolean do_prepend = FALSE; */
+ /*
+ * If this is a case where prepending the task to its priority is
+ * potentially desired, then we need to consider whether to do it.
+ * This usually occurs when a task lowers its priority implcitly as
+ * the result of losing inherited priority. Normal explicit priority
+ * change calls (e.g. rtems_task_set_priority) should always do an
+ * append not a prepend.
+ */
+
+ /*
+ * Techically, the prepend should conditional on the thread lowering
+ * its priority but that does allow cxd2004 of the acvc 2.0.1 to
+ * pass with rtems 4.0.0. This should change when gnat redoes its
+ * priority scheme.
+ */
+/*
+ if ( prepend_it &&
+ _Thread_Is_executing( the_thread ) &&
+ new_priority >= the_thread->current_priority )
+ prepend_it = TRUE;
+*/
+
_Thread_Set_transient( the_thread );
if ( the_thread->current_priority != new_priority )
@@ -1237,7 +1262,10 @@ void _Thread_Change_priority(
}
_Priority_Add_to_bit_map( &the_thread->Priority_map );
- _Chain_Append_unprotected( the_thread->ready, &the_thread->Object.Node );
+ if ( prepend_it )
+ _Chain_Prepend_unprotected( the_thread->ready, &the_thread->Object.Node );
+ else
+ _Chain_Append_unprotected( the_thread->ready, &the_thread->Object.Node );
_ISR_Flash( level );
@@ -1246,7 +1274,6 @@ void _Thread_Change_priority(
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Context_Switch_necessary = TRUE;
-
_ISR_Enable( level );
}