diff --git a/src/rcu.h b/src/rcu.h --- a/src/rcu.h +++ b/src/rcu.h @@ -196,11 +196,11 @@ #define IMPLEMENT_RCU_REFCOUNT(T) \ private: \ - std::atomic refcount{0}; \ + mutable std::atomic refcount{0}; \ \ - void acquire() { refcount++; } \ + void acquire() const { refcount++; } \ \ - bool tryDecrement() { \ + bool tryDecrement() const { \ T count = refcount.load(); \ while (count > 0) { \ if (refcount.compare_exchange_weak(count, count - 1)) { \ @@ -211,7 +211,7 @@ return false; \ } \ \ - void release() { \ + void release() const { \ if (tryDecrement()) { \ return; \ } \ diff --git a/src/test/rcu_tests.cpp b/src/test/rcu_tests.cpp --- a/src/test/rcu_tests.cpp +++ b/src/test/rcu_tests.cpp @@ -290,6 +290,17 @@ BOOST_CHECK(gptr != altptr); } +BOOST_AUTO_TEST_CASE(const_rcuptr_test) { + bool isDestroyed = false; + auto ptr = RCUPtr::make([&] { isDestroyed = true; }); + + // Now let's destroy it. + ptr = RCUPtr(); + BOOST_CHECK(!isDestroyed); + RCULock::synchronize(); + BOOST_CHECK(isDestroyed); +} + class RCURefMoveTestItem { const std::function cleanupfun;