diff options
author | Soheil Hassas Yeganeh <soheil@google.com> | 2018-11-28 13:15:24 -0500 |
---|---|---|
committer | Soheil Hassas Yeganeh <soheil@google.com> | 2018-11-28 15:06:57 -0500 |
commit | 9128881b6d97059170270936a13ee7c90f35b30a (patch) | |
tree | 4e48d459ee4d8daceb89175b66cd52950ed21c6d /src/core/lib | |
parent | 5ede895caf13fa60ee632c25bfcb546983ee68ef (diff) |
Add GPR_ATM_INC_ADD_THEN to grpc_core::RefCount
This is to fix the wrong atomic op counts reported by benchmarks.
Also add these macros to windows and gcc-sync headers as noop macros for
consistency.
Diffstat (limited to 'src/core/lib')
-rw-r--r-- | src/core/lib/gprpp/ref_counted.h | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/core/lib/gprpp/ref_counted.h b/src/core/lib/gprpp/ref_counted.h index e366445bff..98de1a3653 100644 --- a/src/core/lib/gprpp/ref_counted.h +++ b/src/core/lib/gprpp/ref_counted.h @@ -21,6 +21,7 @@ #include <grpc/support/port_platform.h> +#include <grpc/support/atm.h> #include <grpc/support/log.h> #include <grpc/support/sync.h> @@ -76,12 +77,15 @@ class RefCount { constexpr explicit RefCount(Value init = 1) : value_(init) {} // Increases the ref-count by `n`. - void Ref(Value n = 1) { value_.fetch_add(n, std::memory_order_relaxed); } + void Ref(Value n = 1) { + GPR_ATM_INC_ADD_THEN(value_.fetch_add(n, std::memory_order_relaxed)); + } // Similar to Ref() with an assert on the ref-count being non-zero. void RefNonZero() { #ifndef NDEBUG - const Value prior = value_.fetch_add(1, std::memory_order_relaxed); + const Value prior = + GPR_ATM_INC_ADD_THEN(value_.fetch_add(1, std::memory_order_relaxed)); assert(prior > 0); #else Ref(); @@ -90,7 +94,8 @@ class RefCount { // Decrements the ref-count and returns true if the ref-count reaches 0. bool Unref() { - const Value prior = value_.fetch_sub(1, std::memory_order_acq_rel); + const Value prior = + GPR_ATM_INC_ADD_THEN(value_.fetch_sub(1, std::memory_order_acq_rel)); GPR_DEBUG_ASSERT(prior > 0); return prior == 1; } |