aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorponasenko-rs <ponasenko-rs@yandex-team.com>2024-07-16 12:45:57 +0300
committerponasenko-rs <ponasenko-rs@yandex-team.com>2024-07-16 13:00:34 +0300
commit3780d56cf805ef68f1739b4cfb4619ecdb788871 (patch)
treeac34d411cf489903ce5ad56ed166a6d0eed9abe9 /library/cpp
parent4f7ed63af6564380b49bfe854d3b8d5294dbbd5a (diff)
downloadydb-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.h5
-rw-r--r--library/cpp/yt/memory/unittests/atomic_intrusive_ptr_ut.cpp8
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));