Condition.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //
  2. // Condition.cpp
  3. //
  4. // $Id: //poco/1.4/Foundation/src/Condition.cpp#1 $
  5. //
  6. // Library: Foundation
  7. // Package: Threading
  8. // Module: Condition
  9. //
  10. // Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
  11. // and Contributors.
  12. //
  13. // SPDX-License-Identifier: BSL-1.0
  14. //
  15. #include "Poco/Condition.h"
  16. namespace Poco {
  17. Condition::Condition()
  18. {
  19. }
  20. Condition::~Condition()
  21. {
  22. }
  23. void Condition::signal()
  24. {
  25. FastMutex::ScopedLock lock(_mutex);
  26. if (!_waitQueue.empty())
  27. {
  28. _waitQueue.front()->set();
  29. dequeue();
  30. }
  31. }
  32. void Condition::broadcast()
  33. {
  34. FastMutex::ScopedLock lock(_mutex);
  35. for (WaitQueue::iterator it = _waitQueue.begin(); it != _waitQueue.end(); ++it)
  36. {
  37. (*it)->set();
  38. }
  39. _waitQueue.clear();
  40. }
  41. void Condition::enqueue(Event& event)
  42. {
  43. _waitQueue.push_back(&event);
  44. }
  45. void Condition::dequeue()
  46. {
  47. _waitQueue.pop_front();
  48. }
  49. void Condition::dequeue(Event& event)
  50. {
  51. for (WaitQueue::iterator it = _waitQueue.begin(); it != _waitQueue.end(); ++it)
  52. {
  53. if (*it == &event)
  54. {
  55. _waitQueue.erase(it);
  56. break;
  57. }
  58. }
  59. }
  60. } // namespace Poco