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

Unified Diff: Source/wtf/RefCounted.h

Issue 16042013: [oilpan] Resurrect a loop-back persistent handle in RefCountedHeapAllocated (Closed) Base URL: svn://svn.chromium.org/blink/branches/oilpan
Patch Set: Created 7 years, 7 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: Source/wtf/RefCounted.h
diff --git a/Source/wtf/RefCounted.h b/Source/wtf/RefCounted.h
index 0504b9ed2818d7ad9fd164fd9c5a256ab6036c9e..d7214a964fc97071f10aae3636cb248756858c30 100644
--- a/Source/wtf/RefCounted.h
+++ b/Source/wtf/RefCounted.h
@@ -33,7 +33,13 @@ namespace WTF {
#ifdef NDEBUG
#define CHECK_REF_COUNTED_LIFECYCLE 0
#else
-#define CHECK_REF_COUNTED_LIFECYCLE 1
+// FIXME(oilpan): Enable this check once we replace all
+// RefCountedHeapAllocated with HeapAllocated.
+// We have to disable the check for RefCountedHeapAllocated
+// since we have to allow the following situation in RefCountedHeapAllocated.
+// (1) A reference count becomes 0, but Handles keep references to the object.
+// (2) The Handle is assigned to a RefPtr. The reference count becomes 1.
+#define CHECK_REF_COUNTED_LIFECYCLE 0
#endif
// This base class holds the non-template methods and attributes.
@@ -41,27 +47,6 @@ namespace WTF {
// generated by the compiler (technique called template hoisting).
class RefCountedBase {
public:
- void ref()
- {
-#if CHECK_REF_COUNTED_LIFECYCLE
- // Start thread verification as soon as the ref count gets to 2. This
- // heuristic reflects the fact that items are often created on one thread
- // and then given to another thread to be used.
- // FIXME: Make this restriction tigher. Especially as we move to more
- // common methods for sharing items across threads like CrossThreadCopier.h
- // We should be able to add a "detachFromThread" method to make this explicit.
- if (m_refCount == 1)
- m_verifier.setShared(true);
- // If this assert fires, it either indicates a thread safety issue or
- // that the verification needs to change. See ThreadRestrictionVerifier for
- // the different modes.
- ASSERT(m_verifier.isSafeToUse());
- ASSERT(!m_deletionHasBegun);
- ASSERT(!m_adoptionIsRequired);
-#endif
- ++m_refCount;
- }
-
bool hasOneRef() const
{
#if CHECK_REF_COUNTED_LIFECYCLE
@@ -135,6 +120,27 @@ protected:
#endif
}
+ void refBase()
+ {
+#if CHECK_REF_COUNTED_LIFECYCLE
+ // Start thread verification as soon as the ref count gets to 2. This
+ // heuristic reflects the fact that items are often created on one thread
+ // and then given to another thread to be used.
+ // FIXME: Make this restriction tigher. Especially as we move to more
+ // common methods for sharing items across threads like CrossThreadCopier.h
+ // We should be able to add a "detachFromThread" method to make this explicit.
+ if (m_refCount == 1)
+ m_verifier.setShared(true);
+ // If this assert fires, it either indicates a thread safety issue or
+ // that the verification needs to change. See ThreadRestrictionVerifier for
+ // the different modes.
+ ASSERT(m_verifier.isSafeToUse());
+ ASSERT(!m_deletionHasBegun);
+ ASSERT(!m_adoptionIsRequired);
+#endif
+ ++m_refCount;
+ }
+
// Returns whether the pointer should be freed or not.
bool derefBase()
{
@@ -149,6 +155,7 @@ protected:
#if CHECK_REF_COUNTED_LIFECYCLE
m_deletionHasBegun = true;
#endif
+ --m_refCount;
return true;
}
@@ -196,6 +203,11 @@ inline void adopted(RefCountedBase* object)
template<typename T> class RefCounted : public RefCountedBase {
WTF_MAKE_NONCOPYABLE(RefCounted); WTF_MAKE_FAST_ALLOCATED;
public:
+ void ref()
+ {
+ refBase();
+ }
+
void deref()
{
if (derefBase())
@@ -213,6 +225,11 @@ template<typename T> class RefCountedCustomAllocated : public RefCountedBase {
WTF_MAKE_NONCOPYABLE(RefCountedCustomAllocated);
public:
+ void ref()
+ {
+ refBase();
+ }
+
void deref()
{
if (derefBase())

Powered by Google App Engine
This is Rietveld 408576698