waitable_event.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // $Id$
  3. //
  4. #include<__vic/waitable_event.h>
  5. #if __cplusplus < 201103L // C++98
  6. #include<__vic/posix/time.h>
  7. #endif
  8. namespace __vic {
  9. //----------------------------------------------------------------------------
  10. waitable_event::waitable_event(bool signaled)
  11. : signaled_(signaled)
  12. {
  13. }
  14. //----------------------------------------------------------------------------
  15. waitable_event::~waitable_event()
  16. {
  17. }
  18. //----------------------------------------------------------------------------
  19. #if __cplusplus < 201103L // C++98
  20. //----------------------------------------------------------------------------
  21. bool waitable_event::signaled() const
  22. {
  23. return signaled_;
  24. }
  25. //----------------------------------------------------------------------------
  26. void waitable_event::reset()
  27. {
  28. signaled_ = false;
  29. }
  30. //----------------------------------------------------------------------------
  31. bool waitable_event::wait_ms(unsigned msec)
  32. {
  33. if(signaled_) return true;
  34. using posix::time_spec;
  35. time_spec t = posix::nanoseconds_since_epoch() +
  36. time_spec(msec, time_spec::msec);
  37. posix::mutex_lock lock(mtx);
  38. while(cond.wait_until(mtx, t) && !signaled_);
  39. return signaled_;
  40. }
  41. //----------------------------------------------------------------------------
  42. #endif
  43. //----------------------------------------------------------------------------
  44. void waitable_event::wait()
  45. {
  46. while(!signaled())
  47. {
  48. #if __cplusplus >= 201103L // C++11
  49. std::unique_lock<std::mutex> lock(mtx);
  50. cond.wait(lock);
  51. #else // C++98
  52. posix::mutex_lock lock(mtx);
  53. cond.wait(mtx);
  54. #endif
  55. }
  56. }
  57. //----------------------------------------------------------------------------
  58. void waitable_event::set()
  59. {
  60. signaled_ = true;
  61. cond.notify_all();
  62. }
  63. //----------------------------------------------------------------------------
  64. } // namespace