aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorvvvv <vvvv@ydb.tech>2022-08-02 22:47:21 +0300
committervvvv <vvvv@ydb.tech>2022-08-02 22:47:21 +0300
commitd34d0090f4ff0c5c7661d485ddd5d28a61ef3841 (patch)
tree047233332c32ba94edd603891d1686e1c3e47e94 /library/cpp
parent52bf89cad521215af62c22656790e1512dc08fd0 (diff)
downloadydb-d34d0090f4ff0c5c7661d485ddd5d28a61ef3841.tar.gz
coalesce
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/yt/threading/fork_aware_rw_spin_lock.cpp51
-rw-r--r--library/cpp/yt/threading/fork_aware_rw_spin_lock.h34
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