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 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <pthread.h>
0033 #include <errno.h>
0034
0035 #include <rtems/posix/priorityimpl.h>
0036 #include <rtems/posix/threadsup.h>
0037 #include <rtems/score/threadimpl.h>
0038 #include <rtems/score/schedulerimpl.h>
0039
0040 int pthread_setschedprio( pthread_t thread, int prio )
0041 {
0042 Thread_Control *the_thread;
0043 Per_CPU_Control *cpu_self;
0044 Thread_queue_Context queue_context;
0045 const Scheduler_Control *scheduler;
0046 Priority_Control new_priority;
0047 bool valid;
0048
0049 _Thread_queue_Context_initialize( &queue_context );
0050 _Thread_queue_Context_clear_priority_updates( &queue_context );
0051 the_thread = _Thread_Get( thread, &queue_context.Lock_context.Lock_context );
0052
0053 if ( the_thread == NULL ) {
0054 return ESRCH;
0055 }
0056
0057 _Thread_Wait_acquire_critical( the_thread, &queue_context );
0058
0059 scheduler = _Thread_Scheduler_get_home( the_thread );
0060
0061 new_priority = _POSIX_Priority_To_core( scheduler, prio, &valid );
0062 if ( !valid ) {
0063 _Thread_Wait_release( the_thread, &queue_context );
0064 return EINVAL;
0065 }
0066
0067 _Thread_Priority_change(
0068 the_thread,
0069 &the_thread->Real_priority,
0070 new_priority,
0071 PRIORITY_GROUP_FIRST,
0072 &queue_context
0073 );
0074
0075 cpu_self = _Thread_queue_Dispatch_disable( &queue_context );
0076 _Thread_Wait_release( the_thread, &queue_context );
0077
0078 _Thread_Priority_update( &queue_context );
0079
0080 _Thread_Dispatch_enable( cpu_self );
0081 return 0;
0082 }