diff options
author | vvvv <vvvv@ydb.tech> | 2022-08-02 22:47:21 +0300 |
---|---|---|
committer | vvvv <vvvv@ydb.tech> | 2022-08-02 22:47:21 +0300 |
commit | d34d0090f4ff0c5c7661d485ddd5d28a61ef3841 (patch) | |
tree | 047233332c32ba94edd603891d1686e1c3e47e94 /library/cpp | |
parent | 52bf89cad521215af62c22656790e1512dc08fd0 (diff) | |
download | ydb-d34d0090f4ff0c5c7661d485ddd5d28a61ef3841.tar.gz |
coalesce
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/yt/threading/fork_aware_rw_spin_lock.cpp | 51 | ||||
-rw-r--r-- | library/cpp/yt/threading/fork_aware_rw_spin_lock.h | 34 |
2 files changed, 85 insertions, 0 deletions
diff --git a/library/cpp/yt/threading/fork_aware_rw_spin_lock.cpp b/library/cpp/yt/threading/fork_aware_rw_spin_lock.cpp new file mode 100644 index 00000000000..9f214e1ce13 --- /dev/null +++ b/library/cpp/yt/threading/fork_aware_rw_spin_lock.cpp @@ -0,0 +1,51 @@ +#include "fork_aware_rw_spin_lock.h" + +#include "at_fork.h" + +namespace NYT::NThreading { + +//////////////////////////////////////////////////////////////////////////////// + +void TForkAwareReaderWriterSpinLock::AcquireReader() noexcept +{ + GetForkLock()->AcquireReaderForkFriendly(); + SpinLock_.AcquireReader(); +} + +void TForkAwareReaderWriterSpinLock::ReleaseReader() noexcept +{ + SpinLock_.ReleaseReader(); + GetForkLock()->ReleaseReader(); +} + +void TForkAwareReaderWriterSpinLock::AcquireWriter() noexcept +{ + GetForkLock()->AcquireReaderForkFriendly(); + SpinLock_.AcquireWriter(); +} + +void TForkAwareReaderWriterSpinLock::ReleaseWriter() noexcept +{ + SpinLock_.ReleaseWriter(); + GetForkLock()->ReleaseReader(); +} + +bool TForkAwareReaderWriterSpinLock::IsLocked() const noexcept +{ + return SpinLock_.IsLocked(); +} + +bool TForkAwareReaderWriterSpinLock::IsLockedByReader() const noexcept +{ + return SpinLock_.IsLockedByReader(); +} + +bool TForkAwareReaderWriterSpinLock::IsLockedByWriter() const noexcept +{ + return SpinLock_.IsLockedByWriter(); +} + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT::NThreading + diff --git a/library/cpp/yt/threading/fork_aware_rw_spin_lock.h b/library/cpp/yt/threading/fork_aware_rw_spin_lock.h new file mode 100644 index 00000000000..8e7f9e20562 --- /dev/null +++ b/library/cpp/yt/threading/fork_aware_rw_spin_lock.h @@ -0,0 +1,34 @@ +#pragma once + +#include "rw_spin_lock.h" + +namespace NYT::NThreading { + +//////////////////////////////////////////////////////////////////////////////// + +//! Wraps TReaderWriterSpinLock and additionally acquires a global fork lock (in read mode) +//! preventing concurrent forks from happening. +class TForkAwareReaderWriterSpinLock +{ +public: + TForkAwareReaderWriterSpinLock() = default; + TForkAwareReaderWriterSpinLock(const TForkAwareReaderWriterSpinLock&) = delete; + TForkAwareReaderWriterSpinLock& operator =(const TForkAwareReaderWriterSpinLock&) = delete; + + void AcquireReader() noexcept; + void ReleaseReader() noexcept; + + void AcquireWriter() noexcept; + void ReleaseWriter() noexcept; + + bool IsLocked() const noexcept; + bool IsLockedByReader() const noexcept; + bool IsLockedByWriter() const noexcept; + +private: + TReaderWriterSpinLock SpinLock_; +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT::NThreading |