diff options
| author | YDBot <[email protected]> | 2026-01-15 00:52:36 +0000 |
|---|---|---|
| committer | YDBot <[email protected]> | 2026-01-15 00:52:36 +0000 |
| commit | 5acf11e0f56d60f4287d7babe0f235789ffd526b (patch) | |
| tree | 471495c3e9c2cc67b208a97a899247b9ce866435 /library/cpp/threading | |
| parent | 2957d23549e52ac4d1d9972eece968ba7979bd55 (diff) | |
| parent | 743db03e460759247cc83b5c9f44cba60416b240 (diff) | |
Sync branches 260115-0051
Diffstat (limited to 'library/cpp/threading')
| -rw-r--r-- | library/cpp/threading/hot_swap/hot_swap.cpp | 9 | ||||
| -rw-r--r-- | library/cpp/threading/hot_swap/hot_swap.h | 36 | ||||
| -rw-r--r-- | library/cpp/threading/hot_swap/ya.make | 4 |
3 files changed, 22 insertions, 27 deletions
diff --git a/library/cpp/threading/hot_swap/hot_swap.cpp b/library/cpp/threading/hot_swap/hot_swap.cpp index f8127ae45f8..ba2601e2b0d 100644 --- a/library/cpp/threading/hot_swap/hot_swap.cpp +++ b/library/cpp/threading/hot_swap/hot_swap.cpp @@ -4,18 +4,17 @@ namespace NHotSwapPrivate { void TWriterLock::Acquire() noexcept { - AtomicIncrement(ReadersCount); + ++ReadersCount; } void TWriterLock::Release() noexcept { - AtomicDecrement(ReadersCount); + --ReadersCount; } void TWriterLock::WaitAllReaders() const noexcept { - TAtomicBase cnt = AtomicGet(ReadersCount); - while (cnt > 0) { + for (i32 cnt = ReadersCount.load(); cnt > 0;) { SpinLockPause(); - cnt = AtomicGet(ReadersCount); + cnt = ReadersCount.load(); Y_ASSERT(cnt >= 0); } } diff --git a/library/cpp/threading/hot_swap/hot_swap.h b/library/cpp/threading/hot_swap/hot_swap.h index e155614b533..5bee1ae25ab 100644 --- a/library/cpp/threading/hot_swap/hot_swap.h +++ b/library/cpp/threading/hot_swap/hot_swap.h @@ -2,12 +2,12 @@ #include <util/generic/cast.h> #include <util/generic/ptr.h> -#include <util/generic/utility.h> -#include <library/cpp/deprecated/atomic/atomic.h> #include <util/system/guard.h> #include <util/system/spinlock.h> #include <util/system/yassert.h> +#include <atomic> + namespace NHotSwapPrivate { // Special guard object for THotSwap class TWriterLock { @@ -19,7 +19,7 @@ namespace NHotSwapPrivate { void WaitAllReaders() const noexcept; private: - TAtomic ReadersCount = 0; + std::atomic<i32> ReadersCount = 0; }; } @@ -52,8 +52,7 @@ public: using TPtr = TIntrusivePtr<T, Ops>; public: - THotSwap() noexcept { - } + THotSwap() noexcept = default; explicit THotSwap(T* p) noexcept { AtomicStore(p); @@ -70,7 +69,8 @@ public: } THotSwap(THotSwap&& other) noexcept { - DoSwap(RawPtr, other.RawPtr); // we don't need thread safety, because both objects are local + RawPtr.store(other.RawPtr.load()); // we don't need thread safety, because both objects are local + other.RawPtr.store(0); } ~THotSwap() noexcept { @@ -86,7 +86,7 @@ public: /// /// @returns Current value of stored object TPtr AtomicLoad() const noexcept { - const TAtomicBase lockIndex = GetLockIndex(); + const ui32 lockIndex = GetLockIndex(); auto guard = Guard(WriterLocks[lockIndex]); // non-blocking (for other AtomicLoad()'s) guard return GetRawPtr(); } @@ -105,24 +105,24 @@ public: private: T* GetRawPtr() const noexcept { - return reinterpret_cast<T*>(AtomicGet(RawPtr)); + return reinterpret_cast<T*>(RawPtr.load()); } - TAtomicBase GetLockIndex() const noexcept { - return AtomicGet(LockIndex); + ui32 GetLockIndex() const noexcept { + return LockIndex.load(); } - TAtomicBase SwitchLockIndex() noexcept; // returns previous index value + ui32 SwitchLockIndex() noexcept; // returns previous index value void SwitchRawPtr(T* from, T* to) noexcept; void WaitReaders() noexcept; private: - TAtomic RawPtr = 0; // T* // Pointer to current value - static_assert(sizeof(TAtomic) == sizeof(T*), "TAtomic can't represent a pointer value"); + std::atomic<intptr_t> RawPtr = 0; // T* // Pointer to current value + static_assert(sizeof(std::atomic<intptr_t>) == sizeof(T*), "std::atomic<intptr_t> can't represent a pointer value"); TAdaptiveLock UpdateMutex; // Guarantee that AtomicStore() will be one at a time mutable NHotSwapPrivate::TWriterLock WriterLocks[2]; // Guarantee that AtomicStore() will wait for all concurrent AtomicLoad()'s completion - TAtomic LockIndex = 0; + std::atomic<ui32> LockIndex = 0; }; // Atomic operations of AtomicLoad: @@ -167,10 +167,10 @@ void THotSwap<T, Ops>::AtomicStore(T* p) noexcept { } template <class T, class Ops> -TAtomicBase THotSwap<T, Ops>::SwitchLockIndex() noexcept { - const TAtomicBase prevIndex = AtomicGet(LockIndex); +ui32 THotSwap<T, Ops>::SwitchLockIndex() noexcept { + const ui32 prevIndex = LockIndex.load(); Y_ASSERT(prevIndex == 0 || prevIndex == 1); - AtomicSet(LockIndex, prevIndex ^ 1); + LockIndex.store(prevIndex ^ 1u); return prevIndex; } @@ -185,7 +185,7 @@ void THotSwap<T, Ops>::SwitchRawPtr(T* from, T* to) noexcept { if (to) Ops::Ref(to); // Ref() for new value - AtomicSet(RawPtr, reinterpret_cast<TAtomicBase>(to)); + RawPtr.store(reinterpret_cast<intptr_t>(to)); if (from) Ops::UnRef(from); // Unref() for old value diff --git a/library/cpp/threading/hot_swap/ya.make b/library/cpp/threading/hot_swap/ya.make index 73cc1694117..e86105d59dc 100644 --- a/library/cpp/threading/hot_swap/ya.make +++ b/library/cpp/threading/hot_swap/ya.make @@ -5,8 +5,4 @@ SRCS( hot_swap.cpp ) -PEERDIR( - library/cpp/deprecated/atomic -) - END() |
