pthread_attr.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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. #include <rtthread.h>
  11. #include "pthread.h"
  12. #include "sched.h"
  13. #include <string.h>
  14. #define DEFAULT_STACK_SIZE 2048
  15. #define DEFAULT_PRIORITY (RT_THREAD_PRIORITY_MAX/2 + RT_THREAD_PRIORITY_MAX/4)
  16. const pthread_attr_t pthread_default_attr =
  17. {
  18. 0, /* stack base */
  19. DEFAULT_STACK_SIZE, /* stack size */
  20. PTHREAD_INHERIT_SCHED, /* Inherit parent prio/policy */
  21. SCHED_FIFO, /* scheduler policy */
  22. {
  23. DEFAULT_PRIORITY, /* scheduler priority */
  24. },
  25. PTHREAD_CREATE_JOINABLE, /* detach state */
  26. };
  27. int pthread_attr_init(pthread_attr_t *attr)
  28. {
  29. RT_ASSERT(attr != RT_NULL);
  30. *attr = pthread_default_attr;
  31. return 0;
  32. }
  33. RTM_EXPORT(pthread_attr_init);
  34. int pthread_attr_destroy(pthread_attr_t *attr)
  35. {
  36. RT_ASSERT(attr != RT_NULL);
  37. memset(attr, 0, sizeof(pthread_attr_t));
  38. return 0;
  39. }
  40. RTM_EXPORT(pthread_attr_destroy);
  41. int pthread_attr_setdetachstate(pthread_attr_t *attr, int state)
  42. {
  43. RT_ASSERT(attr != RT_NULL);
  44. if (state != PTHREAD_CREATE_JOINABLE && state != PTHREAD_CREATE_DETACHED)
  45. return EINVAL;
  46. attr->detachstate = state;
  47. return 0;
  48. }
  49. RTM_EXPORT(pthread_attr_setdetachstate);
  50. int pthread_attr_getdetachstate(pthread_attr_t const *attr, int *state)
  51. {
  52. RT_ASSERT(attr != RT_NULL);
  53. *state = (int)attr->detachstate;
  54. return 0;
  55. }
  56. RTM_EXPORT(pthread_attr_getdetachstate);
  57. int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
  58. {
  59. RT_ASSERT(attr != RT_NULL);
  60. attr->schedpolicy = policy;
  61. return 0;
  62. }
  63. RTM_EXPORT(pthread_attr_setschedpolicy);
  64. int pthread_attr_getschedpolicy(pthread_attr_t const *attr, int *policy)
  65. {
  66. RT_ASSERT(attr != RT_NULL);
  67. *policy = (int)attr->schedpolicy;
  68. return 0;
  69. }
  70. RTM_EXPORT(pthread_attr_getschedpolicy);
  71. int pthread_attr_setschedparam(pthread_attr_t *attr,
  72. struct sched_param const *param)
  73. {
  74. RT_ASSERT(attr != RT_NULL);
  75. RT_ASSERT(param != RT_NULL);
  76. attr->schedparam.sched_priority = param->sched_priority;
  77. return 0;
  78. }
  79. RTM_EXPORT(pthread_attr_setschedparam);
  80. int pthread_attr_getschedparam(pthread_attr_t const *attr,
  81. struct sched_param *param)
  82. {
  83. RT_ASSERT(attr != RT_NULL);
  84. RT_ASSERT(param != RT_NULL);
  85. param->sched_priority = attr->schedparam.sched_priority;
  86. return 0;
  87. }
  88. RTM_EXPORT(pthread_attr_getschedparam);
  89. int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stack_size)
  90. {
  91. RT_ASSERT(attr != RT_NULL);
  92. attr->stacksize = stack_size;
  93. return 0;
  94. }
  95. RTM_EXPORT(pthread_attr_setstacksize);
  96. int pthread_attr_getstacksize(pthread_attr_t const *attr, size_t *stack_size)
  97. {
  98. RT_ASSERT(attr != RT_NULL);
  99. *stack_size = attr->stacksize;
  100. return 0;
  101. }
  102. RTM_EXPORT(pthread_attr_getstacksize);
  103. int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stack_addr)
  104. {
  105. RT_ASSERT(attr != RT_NULL);
  106. return EOPNOTSUPP;
  107. }
  108. RTM_EXPORT(pthread_attr_setstackaddr);
  109. int pthread_attr_getstackaddr(pthread_attr_t const *attr, void **stack_addr)
  110. {
  111. RT_ASSERT(attr != RT_NULL);
  112. return EOPNOTSUPP;
  113. }
  114. RTM_EXPORT(pthread_attr_getstackaddr);
  115. int pthread_attr_setstack(pthread_attr_t *attr,
  116. void *stack_base,
  117. size_t stack_size)
  118. {
  119. RT_ASSERT(attr != RT_NULL);
  120. attr->stackaddr = stack_base;
  121. attr->stacksize = RT_ALIGN_DOWN(stack_size, RT_ALIGN_SIZE);
  122. return 0;
  123. }
  124. RTM_EXPORT(pthread_attr_setstack);
  125. int pthread_attr_getstack(pthread_attr_t const *attr,
  126. void **stack_base,
  127. size_t *stack_size)
  128. {
  129. RT_ASSERT(attr != RT_NULL);
  130. *stack_base = attr->stackaddr;
  131. *stack_size = attr->stacksize;
  132. return 0;
  133. }
  134. RTM_EXPORT(pthread_attr_getstack);
  135. int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guard_size)
  136. {
  137. return EOPNOTSUPP;
  138. }
  139. int pthread_attr_getguardsize(pthread_attr_t const *attr, size_t *guard_size)
  140. {
  141. return EOPNOTSUPP;
  142. }
  143. RTM_EXPORT(pthread_attr_getguardsize);
  144. int pthread_attr_setscope(pthread_attr_t *attr, int scope)
  145. {
  146. if (scope == PTHREAD_SCOPE_SYSTEM)
  147. return 0;
  148. if (scope == PTHREAD_SCOPE_PROCESS)
  149. return EOPNOTSUPP;
  150. return EINVAL;
  151. }
  152. RTM_EXPORT(pthread_attr_setscope);
  153. int pthread_attr_getscope(pthread_attr_t const *attr)
  154. {
  155. return PTHREAD_SCOPE_SYSTEM;
  156. }
  157. RTM_EXPORT(pthread_attr_getscope);