diff options
author | ponasenko-rs <ponasenko-rs@yandex-team.com> | 2024-07-16 12:45:57 +0300 |
---|---|---|
committer | ponasenko-rs <ponasenko-rs@yandex-team.com> | 2024-07-16 13:00:34 +0300 |
commit | 3780d56cf805ef68f1739b4cfb4619ecdb788871 (patch) | |
tree | ac34d411cf489903ce5ad56ed166a6d0eed9abe9 /library/cpp | |
parent | 4f7ed63af6564380b49bfe854d3b8d5294dbbd5a (diff) | |
download | ydb-3780d56cf805ef68f1739b4cfb4619ecdb788871.tar.gz |
Fix checking stale local pointer in the first iteration of cycle in TAtomicIntrusivePtr
68430c6347c40eee09bc63a3441af024780b86d4
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/yt/memory/atomic_intrusive_ptr-inl.h | 5 | ||||
-rw-r--r-- | library/cpp/yt/memory/unittests/atomic_intrusive_ptr_ut.cpp | 8 |
2 files changed, 8 insertions, 5 deletions
diff --git a/library/cpp/yt/memory/atomic_intrusive_ptr-inl.h b/library/cpp/yt/memory/atomic_intrusive_ptr-inl.h index ae8704ae19..21cd8b9412 100644 --- a/library/cpp/yt/memory/atomic_intrusive_ptr-inl.h +++ b/library/cpp/yt/memory/atomic_intrusive_ptr-inl.h @@ -70,7 +70,10 @@ TIntrusivePtr<T> TAtomicIntrusivePtr<T>::Acquire() const } // Can not Ref(obj) here because it can be destroyed. - if (Ptr_.compare_exchange_weak(ptr, TTaggedPtr(obj, newLocalRefs).Pack())) { + auto newPtr = TTaggedPtr(obj, newLocalRefs).Pack(); + if (Ptr_.compare_exchange_weak(ptr, newPtr)) { + ptr = newPtr; + if (Y_UNLIKELY(newLocalRefs > ReservedRefCount / 2)) { Ref(obj, ReservedRefCount / 2); diff --git a/library/cpp/yt/memory/unittests/atomic_intrusive_ptr_ut.cpp b/library/cpp/yt/memory/unittests/atomic_intrusive_ptr_ut.cpp index 4811d20882..68489fcdf7 100644 --- a/library/cpp/yt/memory/unittests/atomic_intrusive_ptr_ut.cpp +++ b/library/cpp/yt/memory/unittests/atomic_intrusive_ptr_ut.cpp @@ -272,10 +272,10 @@ TEST(TAtomicPtrTest, Acquire) { auto tmp = atomicPtr.Acquire(); - EXPECT_THAT(object, HasRefCounts( RRC + RRC / 2, RRC - 1, 0)); + EXPECT_THAT(object, HasRefCounts(RRC + RRC / 2, RRC / 2, 0)); } - EXPECT_THAT(object, HasRefCounts(RRC + RRC / 2, RRC, 0)); + EXPECT_THAT(object, HasRefCounts(RRC + RRC / 2, RRC / 2 + 1, 0)); } EXPECT_THAT(object, HasRefCounts(RRC + RRC / 2, RRC + RRC / 2, 1)); @@ -298,10 +298,10 @@ TEST(TAtomicPtrTest, AcquireConst) { auto tmp = atomicPtr.Acquire(); - EXPECT_THAT(object, HasRefCounts( RRC + RRC / 2, RRC - 1, 0)); + EXPECT_THAT(object, HasRefCounts(RRC + RRC / 2, RRC / 2, 0)); } - EXPECT_THAT(object, HasRefCounts(RRC + RRC / 2, RRC, 0)); + EXPECT_THAT(object, HasRefCounts(RRC + RRC / 2, RRC / 2 + 1, 0)); } EXPECT_THAT(object, HasRefCounts(RRC + RRC / 2, RRC + RRC / 2, 1)); |