summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/include/asio/detail/atomic_count.hpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/include/asio/detail/atomic_count.hpp')
-rw-r--r--3rdparty/asio/include/asio/detail/atomic_count.hpp34
1 files changed, 24 insertions, 10 deletions
diff --git a/3rdparty/asio/include/asio/detail/atomic_count.hpp b/3rdparty/asio/include/asio/detail/atomic_count.hpp
index 798f9150097..6116279c89e 100644
--- a/3rdparty/asio/include/asio/detail/atomic_count.hpp
+++ b/3rdparty/asio/include/asio/detail/atomic_count.hpp
@@ -2,7 +2,7 @@
// detail/atomic_count.hpp
// ~~~~~~~~~~~~~~~~~~~~~~~
//
-// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -19,11 +19,9 @@
#if !defined(ASIO_HAS_THREADS)
// Nothing to include.
-#elif defined(ASIO_HAS_STD_ATOMIC)
+#else // !defined(ASIO_HAS_THREADS)
# include <atomic>
-#else // defined(ASIO_HAS_STD_ATOMIC)
-# include <boost/detail/atomic_count.hpp>
-#endif // defined(ASIO_HAS_STD_ATOMIC)
+#endif // !defined(ASIO_HAS_THREADS)
namespace asio {
namespace detail {
@@ -31,13 +29,29 @@ namespace detail {
#if !defined(ASIO_HAS_THREADS)
typedef long atomic_count;
inline void increment(atomic_count& a, long b) { a += b; }
-#elif defined(ASIO_HAS_STD_ATOMIC)
+inline void decrement(atomic_count& a, long b) { a -= b; }
+inline void ref_count_up(atomic_count& a) { ++a; }
+inline bool ref_count_down(atomic_count& a) { return --a == 0; }
+#else // !defined(ASIO_HAS_THREADS)
typedef std::atomic<long> atomic_count;
inline void increment(atomic_count& a, long b) { a += b; }
-#else // defined(ASIO_HAS_STD_ATOMIC)
-typedef boost::detail::atomic_count atomic_count;
-inline void increment(atomic_count& a, long b) { while (b > 0) ++a, --b; }
-#endif // defined(ASIO_HAS_STD_ATOMIC)
+inline void decrement(atomic_count& a, long b) { a -= b; }
+
+inline void ref_count_up(atomic_count& a)
+{
+ a.fetch_add(1, std::memory_order_relaxed);
+}
+
+inline bool ref_count_down(atomic_count& a)
+{
+ if (a.fetch_sub(1, std::memory_order_release) == 1)
+ {
+ std::atomic_thread_fence(std::memory_order_acquire);
+ return true;
+ }
+ return false;
+}
+#endif // !defined(ASIO_HAS_THREADS)
} // namespace detail
} // namespace asio