thread.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-04-27 flybreak the first version.
  9. */
  10. #include <arm-tpl.h>
  11. #include "tpl.h"
  12. #include <cstdio>
  13. #include <pthread.h>
  14. #define CPP11_DEFAULT_ID_OFFSET 1
  15. extern "C" int __ARM_TPL_thread_create(__ARM_TPL_thread_t *__t,
  16. void *(*__func)(void *),
  17. void *__arg)
  18. {
  19. int ret = 0;
  20. pthread_t pid;
  21. ret = pthread_create(&pid, RT_NULL, __func, __arg);
  22. if (ret == 0)
  23. {
  24. __t->data = (std::uintptr_t)pid + CPP11_DEFAULT_ID_OFFSET;
  25. return 0;
  26. }
  27. return -1;
  28. }
  29. extern "C" int __ARM_TPL_thread_id_compare(__ARM_TPL_thread_id __tid1,
  30. __ARM_TPL_thread_id __tid2)
  31. {
  32. if (__tid1 > __tid2)
  33. return 1;
  34. else if (__tid1 < __tid2)
  35. return -1;
  36. else
  37. return 0;
  38. }
  39. extern "C" __ARM_TPL_thread_id __ARM_TPL_thread_get_current_id()
  40. {
  41. return (__ARM_TPL_thread_id)pthread_self();
  42. }
  43. extern "C" __ARM_TPL_thread_id __ARM_TPL_thread_get_id(
  44. const __ARM_TPL_thread_t *__t)
  45. {
  46. return (__ARM_TPL_thread_id)(((pthread_t)__t->data - CPP11_DEFAULT_ID_OFFSET));
  47. }
  48. extern "C" int __ARM_TPL_thread_join(__ARM_TPL_thread_t *__t)
  49. {
  50. pthread_join(((pthread_t)__t->data - CPP11_DEFAULT_ID_OFFSET), RT_NULL);
  51. return 0;
  52. }
  53. extern "C" int __ARM_TPL_thread_detach(__ARM_TPL_thread_t *__t)
  54. {
  55. pthread_detach(((pthread_t)__t->data - CPP11_DEFAULT_ID_OFFSET));
  56. return 0;
  57. }
  58. extern "C" void __ARM_TPL_thread_yield()
  59. {
  60. rt_thread_yield();
  61. }
  62. extern "C" int __ARM_TPL_thread_nanosleep(const __ARM_TPL_timespec_t *__req,
  63. __ARM_TPL_timespec_t *__rem)
  64. {
  65. rt_tick_t tick;
  66. tick = __req->tv_sec * RT_TICK_PER_SECOND + (__req->tv_nsec * RT_TICK_PER_SECOND)/ 1000000000;
  67. rt_thread_delay(tick);
  68. if (__rem)
  69. {
  70. tick = rt_tick_get() - tick;
  71. /* get the passed time */
  72. __rem->tv_sec = tick/RT_TICK_PER_SECOND;
  73. __rem->tv_nsec = (tick%RT_TICK_PER_SECOND) * (1000000000/RT_TICK_PER_SECOND);
  74. }
  75. return 0;
  76. }
  77. extern "C" unsigned __ARM_TPL_thread_hw_concurrency()
  78. {
  79. return 1;
  80. }
  81. extern "C" int __ARM_TPL_tls_create(__ARM_TPL_tls_key *__key,
  82. void (*__at_exit)(void *))
  83. {
  84. pthread_key_t key;
  85. if (pthread_key_create(&key, __at_exit) == 0)
  86. {
  87. *__key = key;
  88. return 0;
  89. }
  90. return -1;
  91. }
  92. extern "C" void *__ARM_TPL_tls_get(__ARM_TPL_tls_key __key)
  93. {
  94. return pthread_getspecific(__key);
  95. }
  96. extern "C" int __ARM_TPL_tls_set(__ARM_TPL_tls_key __key, void *__p)
  97. {
  98. if (pthread_setspecific(__key, (void*)__p) != 0)
  99. {
  100. return -1;
  101. }
  102. return 0;
  103. }