pthread_barrier.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <pthread.h>
  2. int pthread_barrierattr_destroy(pthread_barrierattr_t *attr)
  3. {
  4. if (!attr) return EINVAL;
  5. return 0;
  6. }
  7. int pthread_barrierattr_init(pthread_barrierattr_t *attr)
  8. {
  9. if (!attr) return EINVAL;
  10. *attr = PTHREAD_PROCESS_PRIVATE;
  11. return 0;
  12. }
  13. int pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr, int *pshared)
  14. {
  15. if (!attr) return EINVAL;
  16. *pshared = (int)*attr;
  17. return 0;
  18. }
  19. int pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared)
  20. {
  21. if (!attr) return EINVAL;
  22. if (pshared == PTHREAD_PROCESS_PRIVATE) attr = PTHREAD_PROCESS_PRIVATE;
  23. return EINVAL;
  24. }
  25. int pthread_barrier_destroy(pthread_barrier_t *barrier)
  26. {
  27. rt_err_t result;
  28. if (!barrier) return EINVAL;
  29. result = pthread_cond_destroy(&(barrier->cond));
  30. return result;
  31. }
  32. int pthread_barrier_init(pthread_barrier_t *barrier,
  33. const pthread_barrierattr_t *attr, unsigned count)
  34. {
  35. if (!barrier) return EINVAL;
  36. if (attr &&(*attr != PTHREAD_PROCESS_PRIVATE)) return EINVAL;
  37. barrier->count = count;
  38. pthread_cond_init(&(barrier->cond), NULL);
  39. pthread_mutex_init(&(barrier->mutex), NULL);
  40. return 0;
  41. }
  42. int pthread_barrier_wait(pthread_barrier_t *barrier)
  43. {
  44. rt_err_t result;
  45. if (!barrier) return EINVAL;
  46. result = pthread_mutex_lock(&(barrier->mutex));
  47. if (result != 0) return EINVAL;
  48. if (barrier->count == 0) result = EINVAL;
  49. else
  50. {
  51. barrier->count -= 1;
  52. if (barrier->count == 0) /* broadcast condition */
  53. pthread_cond_broadcast(&(barrier->cond));
  54. else
  55. pthread_cond_wait(&(barrier->cond), &(barrier->mutex));
  56. }
  57. pthread_mutex_unlock(&(barrier->mutex));
  58. return result;
  59. }