aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/gprpp
diff options
context:
space:
mode:
authorGravatar Soheil Hassas Yeganeh <soheil@google.com>2018-11-28 13:15:24 -0500
committerGravatar Soheil Hassas Yeganeh <soheil@google.com>2018-11-28 15:06:57 -0500
commit9128881b6d97059170270936a13ee7c90f35b30a (patch)
tree4e48d459ee4d8daceb89175b66cd52950ed21c6d /src/core/lib/gprpp
parent5ede895caf13fa60ee632c25bfcb546983ee68ef (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/gprpp')
-rw-r--r--src/core/lib/gprpp/ref_counted.h11
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;
}