barrier.cc 570 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include "barrier.h"
  2. #include "log.h"
  3. Barrier::Barrier(int count)
  4. : m_count(count)
  5. , m_arrived(0)
  6. , m_leaving(0)
  7. , m_lock()
  8. , m_cond()
  9. {
  10. }
  11. Barrier::~Barrier()
  12. {
  13. }
  14. void Barrier::wait()
  15. {
  16. while((volatile int)m_leaving > 0)
  17. sched_yield(); // Not everyone has left, wait a bit
  18. m_lock.acquire();
  19. ++m_arrived;
  20. if (m_arrived == m_count)
  21. {
  22. m_arrived = 0;
  23. m_leaving = m_count - 1;
  24. m_lock.release();
  25. m_cond.broadcast();
  26. }
  27. else
  28. {
  29. m_cond.wait(m_lock);
  30. --m_leaving;
  31. m_lock.release();
  32. }
  33. }