Condition.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../Core/Condition.h"
  5. #ifdef _WIN32
  6. #include "../Engine/WinWrapped.h"
  7. #else
  8. #include <pthread.h>
  9. #endif
  10. namespace Urho3D
  11. {
  12. #ifdef _WIN32
  13. Condition::Condition() :
  14. event_(nullptr)
  15. {
  16. event_ = CreateEvent(nullptr, FALSE, FALSE, nullptr);
  17. }
  18. Condition::~Condition()
  19. {
  20. CloseHandle((HANDLE)event_);
  21. event_ = nullptr;
  22. }
  23. void Condition::Set()
  24. {
  25. SetEvent((HANDLE)event_);
  26. }
  27. void Condition::Wait()
  28. {
  29. WaitForSingleObject((HANDLE)event_, INFINITE);
  30. }
  31. #else
  32. Condition::Condition() :
  33. mutex_(new pthread_mutex_t),
  34. event_(new pthread_cond_t)
  35. {
  36. pthread_mutex_init((pthread_mutex_t*)mutex_, nullptr);
  37. pthread_cond_init((pthread_cond_t*)event_, nullptr);
  38. }
  39. Condition::~Condition()
  40. {
  41. auto* cond = (pthread_cond_t*)event_;
  42. auto* mutex = (pthread_mutex_t*)mutex_;
  43. pthread_cond_destroy(cond);
  44. pthread_mutex_destroy(mutex);
  45. delete cond;
  46. delete mutex;
  47. event_ = nullptr;
  48. mutex_ = nullptr;
  49. }
  50. void Condition::Set()
  51. {
  52. pthread_cond_signal((pthread_cond_t*)event_);
  53. }
  54. void Condition::Wait()
  55. {
  56. auto* cond = (pthread_cond_t*)event_;
  57. auto* mutex = (pthread_mutex_t*)mutex_;
  58. pthread_mutex_lock(mutex);
  59. pthread_cond_wait(cond, mutex);
  60. pthread_mutex_unlock(mutex);
  61. }
  62. #endif
  63. }