pthread_barrier.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. rt_err_t result;
  36. if (!barrier) return EINVAL;
  37. if (attr &&(*attr != PTHREAD_PROCESS_PRIVATE)) return EINVAL;
  38. barrier->count = count;
  39. pthread_cond_init(&(barrier->cond), NULL);
  40. pthread_mutex_init(&(barrier->mutex), NULL);
  41. return 0;
  42. }
  43. int pthread_barrier_wait(pthread_barrier_t *barrier)
  44. {
  45. rt_err_t result;
  46. if (!barrier) return EINVAL;
  47. result = pthread_mutex_lock(&(barrier->mutex));
  48. if (result != 0) return EINVAL;
  49. if (barrier->count == 0) result = EINVAL;
  50. else
  51. {
  52. barrier->count -= 1;
  53. if (barrier->count == 0) /* broadcast condition */
  54. pthread_cond_broadcast(&(barrier->cond));
  55. else
  56. pthread_cond_wait(&(barrier->cond), &(barrier->mutex));
  57. }
  58. pthread_mutex_unlock(&(barrier->mutex));
  59. return result;
  60. }