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

Unified Diff: Source/platform/heap/Heap.h

Issue 980653002: Oilpan: disable conservative GCs during initial GC mixin construction. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add GC mixin test Created 5 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
« no previous file with comments | « Source/core/workers/SharedWorker.h ('k') | Source/platform/heap/HeapTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/heap/Heap.h
diff --git a/Source/platform/heap/Heap.h b/Source/platform/heap/Heap.h
index 0a00ff544a88991b8f4dfb8cd2c130ef9733b6ce..885aaa4dac2be96a332d1991774aeb1489c9ad9c 100644
--- a/Source/platform/heap/Heap.h
+++ b/Source/platform/heap/Heap.h
@@ -1091,68 +1091,6 @@ struct HeapIndexTrait {
FOR_EACH_TYPED_HEAP(DEFINE_TYPED_HEAP_TRAIT)
#undef DEFINE_TYPED_HEAP_TRAIT
-template<typename T, typename Enabled = void>
-class AllocateObjectTrait {
-public:
- static Address allocate(size_t size)
- {
- ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
- return Heap::allocateOnHeapIndex(state, size, HeapIndexTrait<T>::index(), GCInfoTrait<T>::index());
- }
-
- static void constructor()
- {
- }
-};
-
-template<typename T>
-class AllocateObjectTrait<T, typename WTF::EnableIf<blink::IsGarbageCollectedMixin<T>::value>::Type> {
-public:
- // An object which implements GarbageCollectedMixin is marked
- // and traced during GC by first adjusting object references to
- // it to refer to the leftmost base for the object (which would
- // be a GarbageCollected-derived class.) The prefixed object header
- // can be located after that adjustment and its trace() vtbl slot
- // will be used to fully trace the object, if not already marked.
- //
- // A C++ object's vptr will be initialized to its leftmost base's
- // vtable after the constructors of all its subclasses have run,
- // so if a subclass constructor tries to access any of the vtbl
- // entries of its leftmost base prematurely, it'll find an as-yet
- // incorrect vptr and fail. Which is exactly what a garbage collector
- // will try to do if it tries to access the leftmost base while one
- // of the subclass constructors of a GC mixin object triggers a GC.
- // It is consequently not safe to allow any GCs while these objects
- // are under (sub constructor) construction.
- //
- // To achieve that, the construction of mixins are handled in a
- // special manner:
- //
- // - The initial allocation of the mixin object will enter a no GC scope.
- // - The constructor for the leftmost base, which is when the mixin
- // object is in a state ready for a GC, leaves that GC scope.
- // - no-GC scope entering/leaving must support nesting.
- //
- static Address allocate(size_t size)
- {
- ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
- Address object = Heap::allocateOnHeapIndex(state, size, HeapIndexTrait<T>::index(), GCInfoTrait<T>::index());
- state->enterGCForbiddenScope();
- return object;
- }
-
- static void constructor()
- {
- // FIXME: if prompt conservative GCs are needed, forced GCs that
- // were denied while within this scope, could now be performed.
- // For now, assume the next out-of-line allocation request will
- // happen soon enough and take care of it. Mixin objects aren't
- // overly common.
- ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
- state->leaveGCForbiddenScope();
- }
-};
-
// Base class for objects allocated in the Blink garbage-collected heap.
//
// Defines a 'new' operator that allocates the memory in the heap. 'delete'
@@ -1201,7 +1139,6 @@ public:
protected:
GarbageCollected()
{
- AllocateObjectTrait<T>::constructor();
}
};
@@ -1490,7 +1427,8 @@ inline Address Heap::allocateOnHeapIndex(ThreadState* state, size_t size, int he
template<typename T>
Address Heap::allocate(size_t size)
{
- return AllocateObjectTrait<T>::allocate(size);
+ ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
+ return Heap::allocateOnHeapIndex(state, size, HeapIndexTrait<T>::index(), GCInfoTrait<T>::index());
}
template<typename T>
« no previous file with comments | « Source/core/workers/SharedWorker.h ('k') | Source/platform/heap/HeapTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698