pthread_barrier.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. * 2010-10-26 Bernard the first version
  9. */
  10. #include <pthread.h>
  11. int pthread_barrierattr_destroy(pthread_barrierattr_t *attr)
  12. {
  13. if (!attr)
  14. return EINVAL;
  15. return 0;
  16. }
  17. RTM_EXPORT(pthread_barrierattr_destroy);
  18. int pthread_barrierattr_init(pthread_barrierattr_t *attr)
  19. {
  20. if (!attr)
  21. return EINVAL;
  22. *attr = PTHREAD_PROCESS_PRIVATE;
  23. return 0;
  24. }
  25. RTM_EXPORT(pthread_barrierattr_init);
  26. int pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr,
  27. int *pshared)
  28. {
  29. if (!attr)
  30. return EINVAL;
  31. *pshared = (int)*attr;
  32. return 0;
  33. }
  34. RTM_EXPORT(pthread_barrierattr_getpshared);
  35. int pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared)
  36. {
  37. if (!attr)
  38. return EINVAL;
  39. if (pshared == PTHREAD_PROCESS_PRIVATE)
  40. attr = PTHREAD_PROCESS_PRIVATE;
  41. return EINVAL;
  42. }
  43. RTM_EXPORT(pthread_barrierattr_setpshared);
  44. int pthread_barrier_destroy(pthread_barrier_t *barrier)
  45. {
  46. rt_err_t result;
  47. if (!barrier)
  48. return EINVAL;
  49. result = pthread_cond_destroy(&(barrier->cond));
  50. return result;
  51. }
  52. RTM_EXPORT(pthread_barrier_destroy);
  53. int pthread_barrier_init(pthread_barrier_t *barrier,
  54. const pthread_barrierattr_t *attr,
  55. unsigned count)
  56. {
  57. if (!barrier)
  58. return EINVAL;
  59. if (attr && (*attr != PTHREAD_PROCESS_PRIVATE))
  60. return EINVAL;
  61. barrier->count = count;
  62. pthread_cond_init(&(barrier->cond), NULL);
  63. pthread_mutex_init(&(barrier->mutex), NULL);
  64. return 0;
  65. }
  66. RTM_EXPORT(pthread_barrier_init);
  67. int pthread_barrier_wait(pthread_barrier_t *barrier)
  68. {
  69. rt_err_t result;
  70. if (!barrier)
  71. return EINVAL;
  72. result = pthread_mutex_lock(&(barrier->mutex));
  73. if (result != 0)
  74. return EINVAL;
  75. if (barrier->count == 0)
  76. result = EINVAL;
  77. else
  78. {
  79. barrier->count -= 1;
  80. if (barrier->count == 0) /* broadcast condition */
  81. pthread_cond_broadcast(&(barrier->cond));
  82. else
  83. pthread_cond_wait(&(barrier->cond), &(barrier->mutex));
  84. }
  85. pthread_mutex_unlock(&(barrier->mutex));
  86. return result;
  87. }
  88. RTM_EXPORT(pthread_barrier_wait);