1 /* 2 * Copyright (c) 2006-2018, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2010-10-26 Bernard the first version 9 */ 10 11 #include <rtthread.h> 12 #include "pthread.h" 13 #include "sched.h" 14 #include <string.h> 15 16 #define DEFAULT_STACK_SIZE 2048 17 #define DEFAULT_PRIORITY (RT_THREAD_PRIORITY_MAX/2 + RT_THREAD_PRIORITY_MAX/4) 18 19 const pthread_attr_t pthread_default_attr = 20 { 21 0, /* stack base */ 22 DEFAULT_STACK_SIZE, /* stack size */ 23 DEFAULT_PRIORITY, /* priority */ 24 PTHREAD_CREATE_JOINABLE, /* detach state */ 25 SCHED_FIFO, /* scheduler policy */ 26 PTHREAD_INHERIT_SCHED /* Inherit parent prio/policy */ 27 }; 28 29 int pthread_attr_init(pthread_attr_t *attr) 30 { 31 RT_ASSERT(attr != RT_NULL); 32 33 *attr = pthread_default_attr; 34 35 return 0; 36 } 37 RTM_EXPORT(pthread_attr_init); 38 39 int pthread_attr_destroy(pthread_attr_t *attr) 40 { 41 RT_ASSERT(attr != RT_NULL); 42 43 memset(attr, 0, sizeof(pthread_attr_t)); 44 45 return 0; 46 } 47 RTM_EXPORT(pthread_attr_destroy); 48 49 int pthread_attr_setdetachstate(pthread_attr_t *attr, int state) 50 { 51 RT_ASSERT(attr != RT_NULL); 52 53 if (state != PTHREAD_CREATE_JOINABLE && state != PTHREAD_CREATE_DETACHED) 54 return EINVAL; 55 56 attr->detachstate = state; 57 58 return 0; 59 } 60 RTM_EXPORT(pthread_attr_setdetachstate); 61 62 int pthread_attr_getdetachstate(pthread_attr_t const *attr, int *state) 63 { 64 RT_ASSERT(attr != RT_NULL); 65 66 *state = (int)attr->detachstate; 67 68 return 0; 69 } 70 RTM_EXPORT(pthread_attr_getdetachstate); 71 72 int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy) 73 { 74 RT_ASSERT(attr != RT_NULL); 75 76 attr->policy = policy; 77 78 return 0; 79 } 80 RTM_EXPORT(pthread_attr_setschedpolicy); 81 82 int pthread_attr_getschedpolicy(pthread_attr_t const *attr, int *policy) 83 { 84 RT_ASSERT(attr != RT_NULL); 85 86 *policy = (int)attr->policy; 87 88 return 0; 89 } 90 RTM_EXPORT(pthread_attr_getschedpolicy); 91 92 int pthread_attr_setschedparam(pthread_attr_t *attr, 93 struct sched_param const *param) 94 { 95 RT_ASSERT(attr != RT_NULL); 96 RT_ASSERT(param != RT_NULL); 97 98 attr->priority = param->sched_priority; 99 100 return 0; 101 } 102 RTM_EXPORT(pthread_attr_setschedparam); 103 104 int pthread_attr_getschedparam(pthread_attr_t const *attr, 105 struct sched_param *param) 106 { 107 RT_ASSERT(attr != RT_NULL); 108 RT_ASSERT(param != RT_NULL); 109 110 param->sched_priority = attr->priority; 111 112 return 0; 113 } 114 RTM_EXPORT(pthread_attr_getschedparam); 115 116 int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stack_size) 117 { 118 RT_ASSERT(attr != RT_NULL); 119 120 attr->stack_size = stack_size; 121 122 return 0; 123 } 124 RTM_EXPORT(pthread_attr_setstacksize); 125 126 int pthread_attr_getstacksize(pthread_attr_t const *attr, size_t *stack_size) 127 { 128 RT_ASSERT(attr != RT_NULL); 129 130 *stack_size = attr->stack_size; 131 132 return 0; 133 } 134 RTM_EXPORT(pthread_attr_getstacksize); 135 136 int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stack_addr) 137 { 138 RT_ASSERT(attr != RT_NULL); 139 140 return EOPNOTSUPP; 141 } 142 RTM_EXPORT(pthread_attr_setstackaddr); 143 144 int pthread_attr_getstackaddr(pthread_attr_t const *attr, void **stack_addr) 145 { 146 RT_ASSERT(attr != RT_NULL); 147 148 return EOPNOTSUPP; 149 } 150 RTM_EXPORT(pthread_attr_getstackaddr); 151 152 int pthread_attr_setstack(pthread_attr_t *attr, 153 void *stack_base, 154 size_t stack_size) 155 { 156 RT_ASSERT(attr != RT_NULL); 157 158 attr->stack_base = stack_base; 159 attr->stack_size = RT_ALIGN_DOWN(stack_size, RT_ALIGN_SIZE); 160 161 return 0; 162 } 163 RTM_EXPORT(pthread_attr_setstack); 164 165 int pthread_attr_getstack(pthread_attr_t const *attr, 166 void **stack_base, 167 size_t *stack_size) 168 { 169 RT_ASSERT(attr != RT_NULL); 170 171 *stack_base = attr->stack_base; 172 *stack_size = attr->stack_size; 173 174 return 0; 175 } 176 RTM_EXPORT(pthread_attr_getstack); 177 178 int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guard_size) 179 { 180 return EOPNOTSUPP; 181 } 182 183 int pthread_attr_getguardsize(pthread_attr_t const *attr, size_t *guard_size) 184 { 185 return EOPNOTSUPP; 186 } 187 RTM_EXPORT(pthread_attr_getguardsize); 188 189 int pthread_attr_setscope(pthread_attr_t *attr, int scope) 190 { 191 if (scope == PTHREAD_SCOPE_SYSTEM) 192 return 0; 193 if (scope == PTHREAD_SCOPE_PROCESS) 194 return EOPNOTSUPP; 195 196 return EINVAL; 197 } 198 RTM_EXPORT(pthread_attr_setscope); 199 200 int pthread_attr_getscope(pthread_attr_t const *attr) 201 { 202 return PTHREAD_SCOPE_SYSTEM; 203 } 204 RTM_EXPORT(pthread_attr_getscope); 205