Chromium Code Reviews| 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; |
|
haraken
2013/05/29 14:53:45
This is critical :)
Mads Ager (chromium)
2013/05/29 16:46:38
Yeah, I see, otherwise the ref will actually never
|
| 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()) |