void _Thread_queue_Extract( Thread_Control *the_thread ) { Thread_queue_Context queue_context; Thread_queue_Queue *queue; _Thread_queue_Context_initialize( &queue_context ); _Thread_Wait_acquire( the_thread, &queue_context ); queue = the_thread->Wait.queue; if ( queue != NULL ) { bool unblock; _Thread_Wait_remove_request( the_thread, &queue_context.Lock_context ); _Thread_queue_Context_set_MP_callout( &queue_context, _Thread_queue_MP_callout_do_nothing ); unblock = _Thread_queue_Extract_locked( queue, the_thread->Wait.operations, the_thread, &queue_context ); _Thread_queue_Unblock_critical( unblock, queue, the_thread, &queue_context.Lock_context.Lock_context ); } else { _Thread_Wait_release( the_thread, &queue_context ); } }
static void _Thread_Raise_real_priority( Thread_Control *the_thread, Priority_Control priority ) { Thread_queue_Context queue_context; _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_clear_priority_updates( &queue_context ); _Thread_Wait_acquire( the_thread, &queue_context ); if ( priority < the_thread->Real_priority.priority ) { _Thread_Priority_change( the_thread, &the_thread->Real_priority, priority, false, &queue_context ); } _Thread_Wait_release( the_thread, &queue_context ); _Thread_Priority_update( &queue_context ); }