forked from Imagelibrary/rtems
Previously, the _Thread_Heir was updated unconditionally in case a new heir was determined. The _Thread_Dispatch_necessary was only updated in case the executing thread was preemptible or an internal thread was unblocked. Change this to update the _Thread_Heir and _Thread_Dispatch_necessary only in case the currently selected heir thread is preemptible or a dispatch is forced. Move the schedule decision into the change priority operation and use the schedule operation only in rtems_task_mode() in case preemption is enabled or an ASR dispatch is necessary. This is a behaviour change. Previously, the RTEMS_NO_PREEMPT also prevented signal delivery in certain cases (not always). Now, signal delivery is no longer influenced by RTEMS_NO_PREEMPT. Since the currently selected heir thread is used to determine if a new heir is chosen, non-preemptible heir threads currently not executing now prevent a new heir. This may have an application impact, see change test tm04. Document this change in sp04. Update #2273.
66 lines
1.5 KiB
C
66 lines
1.5 KiB
C
/**
|
|
* @file
|
|
*
|
|
* @brief Removes Thread from Thread Queue
|
|
*
|
|
* @ingroup ScoreScheduler
|
|
*/
|
|
|
|
/*
|
|
* COPYRIGHT (c) 2011.
|
|
* On-Line Applications Research Corporation (OAR).
|
|
*
|
|
* The license and distribution terms for this file may be
|
|
* found in the file LICENSE in this distribution or at
|
|
* http://www.rtems.org/license/LICENSE.
|
|
*/
|
|
|
|
#if HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <rtems/score/schedulerpriorityimpl.h>
|
|
|
|
Scheduler_Void_or_thread _Scheduler_priority_Change_priority(
|
|
const Scheduler_Control *scheduler,
|
|
Thread_Control *the_thread,
|
|
Priority_Control new_priority,
|
|
bool prepend_it
|
|
)
|
|
{
|
|
Scheduler_priority_Context *context =
|
|
_Scheduler_priority_Get_context( scheduler );
|
|
Scheduler_priority_Node *node = _Scheduler_priority_Thread_get_node( the_thread );
|
|
|
|
_Scheduler_priority_Ready_queue_extract(
|
|
&the_thread->Object.Node,
|
|
&node->Ready_queue,
|
|
&context->Bit_map
|
|
);
|
|
|
|
_Scheduler_priority_Ready_queue_update(
|
|
&node->Ready_queue,
|
|
new_priority,
|
|
&context->Bit_map,
|
|
&context->Ready[ 0 ]
|
|
);
|
|
|
|
if ( prepend_it ) {
|
|
_Scheduler_priority_Ready_queue_enqueue_first(
|
|
&the_thread->Object.Node,
|
|
&node->Ready_queue,
|
|
&context->Bit_map
|
|
);
|
|
} else {
|
|
_Scheduler_priority_Ready_queue_enqueue(
|
|
&the_thread->Object.Node,
|
|
&node->Ready_queue,
|
|
&context->Bit_map
|
|
);
|
|
}
|
|
|
|
_Scheduler_priority_Schedule_body( scheduler, the_thread, false );
|
|
|
|
SCHEDULER_RETURN_VOID_OR_NULL;
|
|
}
|