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 #define _GNU_SOURCE
0038
0039 #ifdef HAVE_CONFIG_H
0040 #include "config.h"
0041 #endif
0042
0043 #include <pthread.h>
0044 #include <errno.h>
0045 #include <string.h>
0046
0047 #include <rtems/posix/pthreadimpl.h>
0048 #include <rtems/posix/posixapi.h>
0049 #include <rtems/posix/pthreadattrimpl.h>
0050 #include <rtems/posix/priorityimpl.h>
0051 #include <rtems/score/schedulerimpl.h>
0052 #include <rtems/score/threadimpl.h>
0053
0054 int pthread_getattr_np(
0055 pthread_t thread,
0056 pthread_attr_t *attr
0057 )
0058 {
0059 Thread_Control *the_thread;
0060 ISR_lock_Context lock_context;
0061 const Thread_CPU_budget_operations *cpu_budget_operations;
0062 const Scheduler_Control *scheduler;
0063 Priority_Control priority;
0064 Status_Control status;
0065
0066 if ( attr == NULL ) {
0067 return EINVAL;
0068 }
0069
0070 attr = memset( attr, 0, sizeof( *attr ) );
0071
0072 the_thread = _Thread_Get( thread, &lock_context );
0073
0074 if ( the_thread == NULL ) {
0075 return ESRCH;
0076 }
0077
0078 _Thread_State_acquire_critical( the_thread, &lock_context );
0079
0080 attr->stackaddr = the_thread->Start.Initial_stack.area;
0081 attr->stacksize = the_thread->Start.Initial_stack.size;
0082
0083 if ( the_thread->was_created_with_inherited_scheduler ) {
0084 attr->inheritsched = PTHREAD_INHERIT_SCHED;
0085 } else {
0086 attr->inheritsched = PTHREAD_EXPLICIT_SCHED;
0087 }
0088
0089 scheduler = _Thread_Scheduler_get_home( the_thread );
0090 _POSIX_Threads_Get_sched_param_sporadic(
0091 the_thread,
0092 scheduler,
0093 &attr->schedparam
0094 );
0095 priority = the_thread->Real_priority.priority;
0096
0097 if ( _Thread_Is_joinable( the_thread ) ) {
0098 attr->detachstate = PTHREAD_CREATE_JOINABLE;
0099 } else {
0100 attr->detachstate = PTHREAD_CREATE_DETACHED;
0101 }
0102
0103 attr->affinityset = &attr->affinitysetpreallocated;
0104 attr->affinitysetsize = sizeof( attr->affinitysetpreallocated );
0105 status = _Scheduler_Get_affinity(
0106 the_thread,
0107 attr->affinitysetsize,
0108 attr->affinityset
0109 );
0110
0111 cpu_budget_operations = the_thread->CPU_budget.operations;
0112
0113 _Thread_State_release( the_thread, &lock_context );
0114
0115 attr->is_initialized = true;
0116 attr->contentionscope = PTHREAD_SCOPE_PROCESS;
0117 attr->cputime_clock_allowed = 1;
0118 attr->schedparam.sched_priority = _POSIX_Priority_From_core(
0119 scheduler,
0120 priority
0121 );
0122 attr->schedpolicy =
0123 _POSIX_Thread_Translate_to_sched_policy( cpu_budget_operations );
0124
0125 return _POSIX_Get_error( status );
0126 }