forked from Imagelibrary/rtems
score: Update priority only if necessary
In _Thread_queue_Flush_critical(), update the priority of the thread queue owner only if necessary. The scheduler update priority operation could be expensive.
This commit is contained in:
@@ -366,8 +366,8 @@ RTEMS_INLINE_ROUTINE void _Thread_queue_Context_clear_priority_updates(
|
|||||||
*
|
*
|
||||||
* @return The priority update count of @a queue_context.
|
* @return The priority update count of @a queue_context.
|
||||||
*/
|
*/
|
||||||
RTEMS_INLINE_ROUTINE size_t _Thread_queue_Context_save_priority_updates(
|
RTEMS_INLINE_ROUTINE size_t _Thread_queue_Context_get_priority_updates(
|
||||||
Thread_queue_Context *queue_context
|
const Thread_queue_Context *queue_context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return queue_context->Priority.update_count;
|
return queue_context->Priority.update_count;
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ void _Thread_Priority_perform_actions(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
the_thread = start_of_path;
|
the_thread = start_of_path;
|
||||||
update_count = _Thread_queue_Context_save_priority_updates( queue_context );
|
update_count = _Thread_queue_Context_get_priority_updates( queue_context );
|
||||||
|
|
||||||
while ( true ) {
|
while ( true ) {
|
||||||
Thread_queue_Queue *queue;
|
Thread_queue_Queue *queue;
|
||||||
|
|||||||
@@ -72,14 +72,14 @@ size_t _Thread_queue_Flush_critical(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
size_t flushed;
|
size_t flushed;
|
||||||
|
size_t priority_updates;
|
||||||
Chain_Control unblock;
|
Chain_Control unblock;
|
||||||
Thread_Control *owner;
|
|
||||||
Chain_Node *node;
|
Chain_Node *node;
|
||||||
Chain_Node *tail;
|
Chain_Node *tail;
|
||||||
|
|
||||||
flushed = 0;
|
flushed = 0;
|
||||||
|
priority_updates = 0;
|
||||||
_Chain_Initialize_empty( &unblock );
|
_Chain_Initialize_empty( &unblock );
|
||||||
owner = queue->owner;
|
|
||||||
|
|
||||||
while ( true ) {
|
while ( true ) {
|
||||||
Thread_queue_Heads *heads;
|
Thread_queue_Heads *heads;
|
||||||
@@ -99,8 +99,7 @@ size_t _Thread_queue_Flush_critical(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* We do not have enough space in the queue context to collect all priority
|
* We do not have enough space in the queue context to collect all priority
|
||||||
* updates, so clear it each time. We unconditionally do the priority
|
* updates, so clear it each time and accumulate the priority updates.
|
||||||
* update for the owner later if it exists.
|
|
||||||
*/
|
*/
|
||||||
_Thread_queue_Context_clear_priority_updates( queue_context );
|
_Thread_queue_Context_clear_priority_updates( queue_context );
|
||||||
|
|
||||||
@@ -120,6 +119,8 @@ size_t _Thread_queue_Flush_critical(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
priority_updates +=
|
||||||
|
_Thread_queue_Context_get_priority_updates( queue_context );
|
||||||
++flushed;
|
++flushed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,9 +146,12 @@ size_t _Thread_queue_Flush_critical(
|
|||||||
node = next;
|
node = next;
|
||||||
} while ( node != tail );
|
} while ( node != tail );
|
||||||
|
|
||||||
if ( owner != NULL ) {
|
if ( priority_updates != 0 ) {
|
||||||
|
Thread_Control *owner;
|
||||||
ISR_lock_Context lock_context;
|
ISR_lock_Context lock_context;
|
||||||
|
|
||||||
|
owner = queue->owner;
|
||||||
|
_Assert( owner != NULL );
|
||||||
_Thread_State_acquire( owner, &lock_context );
|
_Thread_State_acquire( owner, &lock_context );
|
||||||
_Scheduler_Update_priority( owner );
|
_Scheduler_Update_priority( owner );
|
||||||
_Thread_State_release( owner, &lock_context );
|
_Thread_State_release( owner, &lock_context );
|
||||||
|
|||||||
Reference in New Issue
Block a user