From 455910e8f261961a84063e5a4213d8f935153480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Dee=20=28J=C5=8Dshin=29?= Date: Mon, 21 Apr 2025 05:36:50 -0700 Subject: [PATCH] Make more shared_ptr fixes (#1401) * Make refcount reads explicitly atomic * Consistently put `const` in the same place * Write the general `operator=` on `weak_ptr` --- ctl/shared_ptr.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ctl/shared_ptr.h b/ctl/shared_ptr.h index 78cf4aeb2..5db5ec01c 100644 --- a/ctl/shared_ptr.h +++ b/ctl/shared_ptr.h @@ -97,12 +97,12 @@ class shared_ref size_t use_count() const noexcept { - return shared + 1; + return __atomic_load_n(&shared, __ATOMIC_RELAXED) + 1; } size_t weak_count() const noexcept { - return weak; + return __atomic_load_n(&weak, __ATOMIC_RELAXED); } private: @@ -382,7 +382,7 @@ class weak_ptr rc->keep_weak(); } - weak_ptr(weak_ptr const& r) noexcept : p(r.p), rc(r.rc) + weak_ptr(const weak_ptr& r) noexcept : p(r.p), rc(r.rc) { if (rc) rc->keep_weak(); @@ -390,7 +390,7 @@ class weak_ptr template requires __::shared_ptr_compatible - weak_ptr(weak_ptr const& r) noexcept : p(r.p), rc(r.rc) + weak_ptr(const weak_ptr& r) noexcept : p(r.p), rc(r.rc) { if (rc) rc->keep_weak(); @@ -444,6 +444,13 @@ class weak_ptr return *this; } + template + requires __::shared_ptr_compatible + weak_ptr& operator=(weak_ptr r) noexcept + { + weak_ptr(move(r)).swap(*this); + } + shared_ptr lock() const noexcept { if (expired())