pthread_attr.c 4.5 KB

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