diff --git a/include/__memory/shared_ptr.h b/include/__memory/shared_ptr.h index d9ddb8a..4b9da00 100644 --- a/include/__memory/shared_ptr.h +++ b/include/__memory/shared_ptr.h @@ -54,7 +54,7 @@ #include #include #if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) -# include <__atomic/memory_order.h> +# include #endif #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -149,7 +149,12 @@ class _LIBCPP_EXPORTED_FROM_ABI __shared_count __shared_count& operator=(const __shared_count&); protected: - long __shared_owners_; +#ifdef _LIBCPP_HAS_NO_THREADS + typedef long __atomic_count; +#else + typedef atomic __atomic_count; +#endif + __atomic_count __shared_owners_; virtual ~__shared_count(); private: virtual void __on_zero_shared() _NOEXCEPT = 0; @@ -165,11 +170,19 @@ public: #else _LIBCPP_INLINE_VISIBILITY void __add_shared() _NOEXCEPT { +#ifdef _LIBCPP_HAS_NO_THREADS __libcpp_atomic_refcount_increment(__shared_owners_); +#else + __shared_owners_++; +#endif } _LIBCPP_INLINE_VISIBILITY bool __release_shared() _NOEXCEPT { +#ifdef _LIBCPP_HAS_NO_THREADS if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) { +#else + if (--__shared_owners_ == -1) { +#endif __on_zero_shared(); return true; } @@ -178,14 +191,23 @@ public: #endif _LIBCPP_INLINE_VISIBILITY long use_count() const _NOEXCEPT { +#ifdef _LIBCPP_HAS_NO_THREADS return __libcpp_relaxed_load(&__shared_owners_) + 1; +#else + return __shared_owners_.load(memory_order_relaxed) + 1; +#endif } }; class _LIBCPP_EXPORTED_FROM_ABI __shared_weak_count : private __shared_count { - long __shared_weak_owners_; +#ifdef _LIBCPP_HAS_NO_THREADS + typedef long __atomic_count; +#else + typedef atomic __atomic_count; +#endif + __atomic_count __shared_weak_owners_; public: _LIBCPP_INLINE_VISIBILITY @@ -207,7 +229,11 @@ public: } _LIBCPP_INLINE_VISIBILITY void __add_weak() _NOEXCEPT { +#ifdef _LIBCPP_HAS_NO_THREADS __libcpp_atomic_refcount_increment(__shared_weak_owners_); +#else + __shared_weak_owners_++; +#endif } _LIBCPP_INLINE_VISIBILITY void __release_shared() _NOEXCEPT {