1
0

pthread_barrier.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. if (count == 0)
  62. return EINVAL;
  63. barrier->count = count;
  64. pthread_cond_init(&(barrier->cond), NULL);
  65. pthread_mutex_init(&(barrier->mutex), NULL);
  66. return 0;
  67. }
  68. RTM_EXPORT(pthread_barrier_init);
  69. int pthread_barrier_wait(pthread_barrier_t *barrier)
  70. {
  71. rt_err_t result;
  72. if (!barrier)
  73. return EINVAL;
  74. result = pthread_mutex_lock(&(barrier->mutex));
  75. if (result != 0)
  76. return EINVAL;
  77. if (barrier->count == 0)
  78. result = EINVAL;
  79. else
  80. {
  81. barrier->count -= 1;
  82. if (barrier->count == 0) /* broadcast condition */
  83. pthread_cond_broadcast(&(barrier->cond));
  84. else
  85. pthread_cond_wait(&(barrier->cond), &(barrier->mutex));
  86. }
  87. pthread_mutex_unlock(&(barrier->mutex));
  88. return result;
  89. }
  90. RTM_EXPORT(pthread_barrier_wait);