latch.h 903 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #pragma once
  2. #include <util/system/condvar.h>
  3. #include <util/system/mutex.h>
  4. class TLatch {
  5. private:
  6. // 0 for unlocked, 1 for locked
  7. TAtomic Locked;
  8. TMutex Mutex;
  9. TCondVar CondVar;
  10. public:
  11. TLatch()
  12. : Locked(0)
  13. {
  14. }
  15. void Wait() {
  16. // optimistic path
  17. if (AtomicGet(Locked) == 0) {
  18. return;
  19. }
  20. TGuard<TMutex> guard(Mutex);
  21. while (AtomicGet(Locked) == 1) {
  22. CondVar.WaitI(Mutex);
  23. }
  24. }
  25. bool TryWait() {
  26. return AtomicGet(Locked) == 0;
  27. }
  28. void Unlock() {
  29. // optimistic path
  30. if (AtomicGet(Locked) == 0) {
  31. return;
  32. }
  33. TGuard<TMutex> guard(Mutex);
  34. AtomicSet(Locked, 0);
  35. CondVar.BroadCast();
  36. }
  37. void Lock() {
  38. AtomicSet(Locked, 1);
  39. }
  40. bool IsLocked() {
  41. return AtomicGet(Locked);
  42. }
  43. };