thread.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. extern "C" int __ARM_TPL_thread_create(__ARM_TPL_thread_t *__t,
  15. void *(*__func)(void *),
  16. void *__arg)
  17. {
  18. int ret = 0;
  19. /* TODO memory leek */
  20. pthread_t *pid = (pthread_t *)rt_malloc(sizeof(pthread_t));
  21. if (pid == nullptr)
  22. return -1;
  23. ret = pthread_create(pid, RT_NULL, __func, __arg);
  24. if (ret == 0)
  25. {
  26. __t->data = (std::uintptr_t)pid;
  27. return 0;
  28. }
  29. return -1;
  30. }
  31. extern "C" int __ARM_TPL_thread_id_compare(__ARM_TPL_thread_id __tid1,
  32. __ARM_TPL_thread_id __tid2)
  33. {
  34. if (__tid1 > __tid2)
  35. return 1;
  36. else if (__tid1 < __tid2)
  37. return -1;
  38. else
  39. return 0;
  40. }
  41. extern "C" __ARM_TPL_thread_id __ARM_TPL_thread_get_current_id()
  42. {
  43. return (__ARM_TPL_thread_id)pthread_self();
  44. }
  45. extern "C" __ARM_TPL_thread_id __ARM_TPL_thread_get_id(
  46. const __ARM_TPL_thread_t *__t)
  47. {
  48. return (__ARM_TPL_thread_id)((*(pthread_t *)__t->data));
  49. }
  50. extern "C" int __ARM_TPL_thread_join(__ARM_TPL_thread_t *__t)
  51. {
  52. pthread_join((*(pthread_t *)__t->data), RT_NULL);
  53. return 0;
  54. }
  55. extern "C" int __ARM_TPL_thread_detach(__ARM_TPL_thread_t *__t)
  56. {
  57. pthread_detach((*(pthread_t *)__t->data));
  58. return 0;
  59. }
  60. extern "C" void __ARM_TPL_thread_yield()
  61. {
  62. rt_thread_yield();
  63. }
  64. extern "C" int __ARM_TPL_thread_nanosleep(const __ARM_TPL_timespec_t *__req,
  65. __ARM_TPL_timespec_t *__rem)
  66. {
  67. rt_tick_t tick;
  68. tick = __req->tv_sec * RT_TICK_PER_SECOND + (__req->tv_nsec * RT_TICK_PER_SECOND)/ 1000000000;
  69. rt_thread_delay(tick);
  70. if (__rem)
  71. {
  72. tick = rt_tick_get() - tick;
  73. /* get the passed time */
  74. __rem->tv_sec = tick/RT_TICK_PER_SECOND;
  75. __rem->tv_nsec = (tick%RT_TICK_PER_SECOND) * (1000000000/RT_TICK_PER_SECOND);
  76. }
  77. return 0;
  78. }
  79. extern "C" unsigned __ARM_TPL_thread_hw_concurrency()
  80. {
  81. return 1;
  82. }
  83. extern "C" int __ARM_TPL_tls_create(__ARM_TPL_tls_key *__key,
  84. void (*__at_exit)(void *))
  85. {
  86. pthread_key_t key;
  87. if (pthread_key_create(&key, __at_exit) == 0)
  88. {
  89. *__key = key;
  90. return 0;
  91. }
  92. return -1;
  93. }
  94. extern "C" void *__ARM_TPL_tls_get(__ARM_TPL_tls_key __key)
  95. {
  96. return pthread_getspecific(__key);
  97. }
  98. extern "C" int __ARM_TPL_tls_set(__ARM_TPL_tls_key __key, void *__p)
  99. {
  100. if (pthread_setspecific(__key, (void*)__p) != 0)
  101. {
  102. return -1;
  103. }
  104. return 0;
  105. }