Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2369)

Unified Diff: base/callback_internal.cc

Issue 2723423002: Start BindStateBase ref count from 1 instead of 0 (Closed)
Patch Set: +comment. +DCHECK. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/callback_internal.cc
diff --git a/base/callback_internal.cc b/base/callback_internal.cc
index 4afd567f0fe32ee65c911f8a1cf55c061c7b95c3..c309a88c7363056a615e90ca5cf43355a6b2c94f 100644
--- a/base/callback_internal.cc
+++ b/base/callback_internal.cc
@@ -17,6 +17,10 @@ bool ReturnFalse(const BindStateBase*) {
} // namespace
+bool BindStateBase::HasOneRef() const {
+ return AtomicRefCountIsOne(&ref_count_);
+}
+
BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke,
void (*destructor)(const BindStateBase*))
: BindStateBase(polymorphic_invoke, destructor, &ReturnFalse) {
@@ -26,12 +30,17 @@ BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke,
void (*destructor)(const BindStateBase*),
bool (*is_cancelled)(const BindStateBase*))
: polymorphic_invoke_(polymorphic_invoke),
- ref_count_(0),
+ ref_count_(1),
destructor_(destructor),
is_cancelled_(is_cancelled) {}
void BindStateBase::AddRef() const {
+#if DCHECK_IS_ON()
+ AtomicRefCount ref_count = subtle::Barrier_AtomicIncrement(&ref_count_, 1);
+ DCHECK_NE(1, ref_count);
+#else
AtomicRefCountInc(&ref_count_);
+#endif
}
void BindStateBase::Release() const {
@@ -70,9 +79,8 @@ bool CallbackBase<CopyMode::MoveOnly>::EqualsInternal(
return bind_state_ == other.bind_state_;
}
-CallbackBase<CopyMode::MoveOnly>::CallbackBase(
- BindStateBase* bind_state)
- : bind_state_(bind_state) {
+CallbackBase<CopyMode::MoveOnly>::CallbackBase(BindStateBase* bind_state)
+ : bind_state_(AdoptRef(bind_state)) {
DCHECK(!bind_state_.get() || bind_state_->ref_count_ == 1);
}
« no previous file with comments | « base/callback_internal.h ('k') | base/memory/ref_counted.h » ('j') | base/memory/ref_counted.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698