fork_aware_spin_lock.cpp 861 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include "fork_aware_spin_lock.h"
  2. #include "at_fork.h"
  3. namespace NYT::NThreading {
  4. ////////////////////////////////////////////////////////////////////////////////
  5. void TForkAwareSpinLock::Acquire() noexcept
  6. {
  7. GetForkLock()->AcquireReaderForkFriendly();
  8. SpinLock_.Acquire();
  9. }
  10. bool TForkAwareSpinLock::TryAcquire() noexcept
  11. {
  12. if (!GetForkLock()->TryAcquireReaderForkFriendly()) {
  13. return false;
  14. }
  15. if (!SpinLock_.TryAcquire()) {
  16. GetForkLock()->ReleaseReader();
  17. return false;
  18. }
  19. return true;
  20. }
  21. void TForkAwareSpinLock::Release() noexcept
  22. {
  23. SpinLock_.Release();
  24. GetForkLock()->ReleaseReader();
  25. }
  26. bool TForkAwareSpinLock::IsLocked() const noexcept
  27. {
  28. return SpinLock_.IsLocked();
  29. }
  30. ////////////////////////////////////////////////////////////////////////////////
  31. } // namespace NYT::NThreading