File indexing completed on 2025-05-11 08:24:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #ifdef HAVE_CONFIG_H
0039 #include "config.h"
0040 #endif
0041
0042 #include <rtems/rtems/tasksimpl.h>
0043 #include <rtems/score/schedulerimpl.h>
0044 #include <rtems/score/threadimpl.h>
0045
0046 static rtems_status_code _RTEMS_tasks_Set_priority(
0047 Thread_Control *the_thread,
0048 const Scheduler_Control *scheduler,
0049 Priority_Control new_priority,
0050 Thread_queue_Context *queue_context
0051 )
0052 {
0053 Priority_Control core_new_priority;
0054 bool valid;
0055 Per_CPU_Control *cpu_self;
0056
0057 core_new_priority = _RTEMS_Priority_To_core(
0058 scheduler,
0059 new_priority,
0060 &valid
0061 );
0062
0063 if ( !valid ) {
0064 _Thread_Wait_release( the_thread, queue_context );
0065 return RTEMS_INVALID_PRIORITY;
0066 }
0067
0068 _Thread_Priority_change(
0069 the_thread,
0070 &the_thread->Real_priority,
0071 core_new_priority,
0072 PRIORITY_GROUP_LAST,
0073 queue_context
0074 );
0075 cpu_self = _Thread_queue_Dispatch_disable( queue_context );
0076 _Thread_Wait_release( the_thread, queue_context );
0077 _Thread_Priority_update( queue_context );
0078 _Thread_Dispatch_enable( cpu_self );
0079 return RTEMS_SUCCESSFUL;
0080 }
0081
0082 rtems_status_code rtems_task_set_priority(
0083 rtems_id id,
0084 rtems_task_priority new_priority,
0085 rtems_task_priority *old_priority_p
0086 )
0087 {
0088 Thread_Control *the_thread;
0089 Thread_queue_Context queue_context;
0090 const Scheduler_Control *scheduler;
0091 Priority_Control old_priority;
0092 rtems_status_code status;
0093
0094 if ( old_priority_p == NULL ) {
0095 return RTEMS_INVALID_ADDRESS;
0096 }
0097
0098 _Thread_queue_Context_initialize( &queue_context );
0099 _Thread_queue_Context_clear_priority_updates( &queue_context );
0100 the_thread = _Thread_Get( id, &queue_context.Lock_context.Lock_context );
0101
0102 if ( the_thread == NULL ) {
0103 #if defined(RTEMS_MULTIPROCESSING)
0104 return _RTEMS_tasks_MP_Set_priority( id, new_priority, old_priority_p );
0105 #else
0106 return RTEMS_INVALID_ID;
0107 #endif
0108 }
0109
0110 _Thread_Wait_acquire_critical( the_thread, &queue_context );
0111
0112 scheduler = _Thread_Scheduler_get_home( the_thread );
0113 old_priority = _Thread_Get_priority( the_thread );
0114
0115 if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
0116 status = _RTEMS_tasks_Set_priority(
0117 the_thread,
0118 scheduler,
0119 new_priority,
0120 &queue_context
0121 );
0122 } else {
0123 _Thread_Wait_release( the_thread, &queue_context );
0124 status = RTEMS_SUCCESSFUL;
0125 }
0126
0127 *old_priority_p = _RTEMS_Priority_From_core( scheduler, old_priority );
0128 return status;
0129 }