Chromium Code Reviews| Index: Source/platform/heap/HeapTest.cpp |
| diff --git a/Source/platform/heap/HeapTest.cpp b/Source/platform/heap/HeapTest.cpp |
| index f5e2d275da575e08cfd551cc608fb5691fc76996..470c69b2f67aa04b998b7e68a8298ca54e962945 100644 |
| --- a/Source/platform/heap/HeapTest.cpp |
| +++ b/Source/platform/heap/HeapTest.cpp |
| @@ -606,90 +606,56 @@ protected: |
| DEFINE_INLINE_TRACE() { } |
| }; |
| - class BookEnd; |
| + class PersistentChain; |
| - class PersistentStore { |
| + class RefCountedChain : public RefCounted<RefCountedChain> { |
| public: |
| - static PersistentStore* create(int count, int* gcCount, BookEnd* bookend) |
| + static RefCountedChain* create(int count) |
| { |
| - return new PersistentStore(count, gcCount, bookend); |
| - } |
| - |
| - void advance() |
| - { |
| - (*m_gcCount)++; |
| - m_store.removeLast(); |
| - // Remove reference to BookEnd when there are no Persistent<Local>s left. |
| - // The BookEnd object will then be swept out at the next GC, and pre-finalized, |
| - // causing this PersistentStore instance to be destructed, along with |
| - // the Persistent<BookEnd>. It being the very last Persistent<>, causing the |
| - // GC loop in ThreadState::detach() to terminate. |
| - if (!m_store.size()) |
| - m_bookend = nullptr; |
| + return new RefCountedChain(count); |
| } |
| private: |
| - PersistentStore(int count, int* gcCount, BookEnd* bookend) |
| + explicit RefCountedChain(int count) |
| { |
| - m_gcCount = gcCount; |
| - m_bookend = bookend; |
| - for (int i = 0; i < count; ++i) |
| - m_store.append(Persistent<ThreadPersistentHeapTester::Local>(new ThreadPersistentHeapTester::Local())); |
| + if (count > 0) { |
| + --count; |
| + m_persistentChain = PersistentChain::create(count); |
| + } |
| } |
| - Vector<Persistent<Local>> m_store; |
| - Persistent<BookEnd> m_bookend; |
| - int* m_gcCount; |
| + Persistent<PersistentChain> m_persistentChain; |
| }; |
| - class BookEnd final : public GarbageCollected<BookEnd> { |
| - USING_PRE_FINALIZER(BookEnd, dispose); |
| + class PersistentChain : public GarbageCollectedFinalized<PersistentChain> { |
| public: |
| - BookEnd() |
| - : m_store(nullptr) |
| - { |
| - ThreadState::current()->registerPreFinalizer(this); |
| - } |
| - |
| - void initialize(PersistentStore* store) |
| + static PersistentChain* create(int count) |
| { |
| - m_store = store; |
| + return new PersistentChain(count); |
| } |
| - void dispose() |
| - { |
| - delete m_store; |
| - } |
| + DEFINE_INLINE_TRACE() { } |
| - DEFINE_INLINE_TRACE() |
|
haraken
2015/07/01 07:43:43
It is invalid to modify the list of persistents in
|
| + private: |
| + explicit PersistentChain(int count) |
| { |
| - ASSERT(m_store); |
| - m_store->advance(); |
| + m_refCountedChain = adoptRef(RefCountedChain::create(count)); |
| } |
| - private: |
| - PersistentStore* m_store; |
| + RefPtr<RefCountedChain> m_refCountedChain; |
| }; |
| virtual void runThread() override |
| { |
| ThreadState::attach(); |
| - const int iterations = 5; |
| - int gcCount = 0; |
| - BookEnd* bookend = new BookEnd(); |
| - PersistentStore* store = PersistentStore::create(iterations, &gcCount, bookend); |
| - bookend->initialize(store); |
| - |
| - bookend = nullptr; |
| - store = nullptr; |
| + PersistentChain::create(100); |
| // Upon thread detach, GCs will run until all persistents have been |
| // released. We verify that the draining of persistents proceeds |
| // as expected by dropping one Persistent<> per GC until there |
| // are none left. |
| ThreadState::detach(); |
| - EXPECT_EQ(iterations, gcCount); |
| atomicDecrement(&m_threadsToFinish); |
| } |
| }; |