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

Unified Diff: Source/platform/heap/HeapTest.cpp

Issue 623033002: Oilpan: Add support of pre-finalization callback to Oilpan infrastructure. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: typos, add an aasertion Created 6 years, 2 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/platform/heap/HeapTest.cpp
diff --git a/Source/platform/heap/HeapTest.cpp b/Source/platform/heap/HeapTest.cpp
index e4a8cb8e7470466a342aed7437fe954f6d1d966b..fc5a2e2539c7dcf43a3d9e0e86dd4bc92e62ca0f 100644
--- a/Source/platform/heap/HeapTest.cpp
+++ b/Source/platform/heap/HeapTest.cpp
@@ -1006,6 +1006,7 @@ private:
};
class Observable : public GarbageCollectedFinalized<Observable> {
+ USING_PRE_FINALIZER(Observable, willFinalize);
public:
static Observable* create(Bar* bar) { return new Observable(bar); }
~Observable() { m_wasDestructed = true; }
@@ -1017,7 +1018,9 @@ public:
{
EXPECT_FALSE(m_wasDestructed);
EXPECT_FALSE(m_bar->hasBeenFinalized());
+ s_willFinalizeWasCalled = true;
}
+ static bool s_willFinalizeWasCalled;
private:
explicit Observable(Bar* bar)
@@ -1030,6 +1033,34 @@ private:
bool m_wasDestructed;
};
+bool Observable::s_willFinalizeWasCalled = false;
+
+class ObservableWithPreFinalizer : public GarbageCollected<ObservableWithPreFinalizer> {
+ USING_PRE_FINALIZER(ObservableWithPreFinalizer, dispose);
+public:
+ static ObservableWithPreFinalizer* create() { return new ObservableWithPreFinalizer(); }
+ ~ObservableWithPreFinalizer() { m_wasDestructed = true; }
+ void trace(Visitor*) { }
+ void dispose()
+ {
+ ThreadState::current()->unregisterPreFinalizer(*this);
+ EXPECT_FALSE(m_wasDestructed);
+ s_disposeWasCalled = true;
+ }
+ static bool s_disposeWasCalled;
+
+private:
+ explicit ObservableWithPreFinalizer()
+ : m_wasDestructed(false)
+ {
+ ThreadState::current()->registerPreFinalizer(*this);
+ }
+
+ bool m_wasDestructed;
+};
+
+bool ObservableWithPreFinalizer::s_disposeWasCalled = false;
+
template <typename T> class FinalizationObserver : public GarbageCollected<FinalizationObserver<T> > {
public:
static FinalizationObserver* create(T* data) { return new FinalizationObserver(data); }
@@ -3282,6 +3313,38 @@ TEST(HeapTest, FinalizationObserver)
EXPECT_TRUE(FinalizationObserverWithHashMap::s_didCallWillFinalize);
}
+TEST(HeapTest, PreFinalizer)
+{
+ Observable::s_willFinalizeWasCalled = false;
+ {
+ Observable* foo = Observable::create(Bar::create());
+ ThreadState::current()->registerPreFinalizer(*foo);
+ }
+ Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
+ EXPECT_TRUE(Observable::s_willFinalizeWasCalled);
+}
+
+TEST(HeapTest, PreFinalizerIsNotCalledIfUnregistered)
+{
+ Observable::s_willFinalizeWasCalled = false;
+ {
+ Observable* foo = Observable::create(Bar::create());
+ ThreadState::current()->registerPreFinalizer(*foo);
+ ThreadState::current()->unregisterPreFinalizer(*foo);
+ }
+ Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
+ EXPECT_FALSE(Observable::s_willFinalizeWasCalled);
+}
+
+TEST(HeapTest, PreFinalizerUnregistersItself)
+{
+ ObservableWithPreFinalizer::s_disposeWasCalled = false;
+ ObservableWithPreFinalizer::create();
+ Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
+ EXPECT_TRUE(ObservableWithPreFinalizer::s_disposeWasCalled);
+ // Don't crash, and assertions don't fail.
+}
+
TEST(HeapTest, Comparisons)
{
Persistent<Bar> barPersistent = Bar::create();

Powered by Google App Engine
This is Rietveld 408576698