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

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

Issue 803443002: Introduce InlinedGlobalMarkingVisitor Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years 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/svg/properties/SVGPropertyHelper.h ('k') | Source/platform/heap/Heap.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 0088c15fce8173262c05554c8cf0cbf0a7a8b031..45b4d96324fb255864a538a9a25b57e084ee2d0b 100644
--- a/Source/platform/heap/Heap.h
+++ b/Source/platform/heap/Heap.h
@@ -185,7 +185,7 @@ public:
if (!objectContains(address))
return nullptr;
return gcInfo();
- }
+ h
#endif
#if ENABLE(GC_PROFILE_HEAP)
@@ -1433,8 +1433,8 @@ public:
static void markNoTracing(Visitor* visitor, const void* t) { visitor->markNoTracing(t); }
- template<typename T, typename Traits>
- static void trace(Visitor* visitor, T& t)
+ template<typename T, typename Traits, typename VisitorDispatcher>
+ static void trace(VisitorDispatcher visitor, T& t)
{
CollectionBackingTraceTrait<WTF::ShouldBeTraced<Traits>::value, Traits::weakHandlingFlag, WTF::WeakPointersActWeak, T, Traits>::trace(visitor, t);
}
@@ -2007,7 +2007,8 @@ namespace WTF {
// weak elements.
template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, T, Traits> {
- static bool trace(blink::Visitor* visitor, T& t)
+ template<typename VisitorDispatcher>
+ static bool trace(VisitorDispatcher visitor, T& t)
{
blink::TraceTrait<T>::trace(visitor, &t);
return false;
@@ -2016,7 +2017,8 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, T, Traits>
template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Member<T>, Traits> {
- static bool trace(blink::Visitor* visitor, blink::Member<T>& t)
+ template<typename VisitorDispatcher>
+ static bool trace(VisitorDispatcher visitor, blink::Member<T>& t)
{
blink::TraceTrait<T>::mark(visitor, const_cast<typename RemoveConst<T>::Type*>(t.get()));
return false;
@@ -2201,7 +2203,7 @@ namespace blink {
// We do nothing, even if WTF::WeakPointersActStrong.
template<WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
struct CollectionBackingTraceTrait<false, WTF::NoWeakHandlingInCollections, strongify, T, Traits> {
- static bool trace(Visitor*, T&) { return false; }
+ template<typename VisitorDispatcher> static bool trace(VisitorDispatcher, T&) { return false; }
};
template<typename T>
@@ -2219,7 +2221,7 @@ static void verifyGarbageCollectedIfMember(Member<T>* t)
// both.
template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
struct CollectionBackingTraceTrait {
- static bool trace(Visitor* visitor, T&t)
+ template<typename VisitorDispatcher> static bool trace(VisitorDispatcher visitor, T& t)
{
verifyGarbageCollectedIfMember(reinterpret_cast<T*>(0));
return WTF::TraceInCollectionTrait<weakHandlingFlag, strongify, T, Traits>::trace(visitor, t);
@@ -2334,6 +2336,85 @@ struct GCInfoTrait<HeapDeque<T, inlineCapacity>> : public GCInfoTrait<Deque<T, i
template<typename T, typename U, typename V>
struct GCInfoTrait<HeapHashCountedSet<T, U, V>> : public GCInfoTrait<HashCountedSet<T, U, V, HeapAllocator>> { };
+NO_SANITIZE_ADDRESS inline
+bool HeapObjectHeader::isMarked() const
+{
+ checkHeader();
+ return m_size & markBitMask;
+}
+
+NO_SANITIZE_ADDRESS inline
+void HeapObjectHeader::mark()
+{
+ checkHeader();
+ ASSERT(!isMarked());
+ m_size = m_size | markBitMask;
+}
+
+ALWAYS_INLINE bool InlinedGlobalMarkingVisitor::isMarked(const void* objectPointer)
+{
+ return GeneralHeapObjectHeader::fromPayload(objectPointer)->isMarked();
+}
+
+ALWAYS_INLINE void InlinedGlobalMarkingVisitor::visitHeader(HeapObjectHeader* header, const void* objectPointer, TraceCallback callback)
+{
+ ASSERT(header);
+ ASSERT(objectPointer);
+ // Check that we are not marking objects that are outside
+ // the heap by calling Heap::contains. However we cannot
+ // call Heap::contains when outside a GC and we call mark
+ // when doing weakness for ephemerons. Hence we only check
+ // when called within.
+ ASSERT(!ThreadState::current()->isInGC() || Heap::containedInHeapOrOrphanedPage(header));
+
+ // If you hit this ASSERT, it means that there is a dangling pointer
+ // from a live thread heap to a dead thread heap. We must eliminate
+ // the dangling pointer.
+ // Release builds don't have the ASSERT, but it is OK because
+ // release builds will crash in the following header->isMarked()
+ // because all the entries of the orphaned heaps are zapped.
+ ASSERT(!pageFromObject(objectPointer)->orphaned());
+
+ if (header->isMarked())
+ return;
+ header->mark();
+
+#if ENABLE(GC_PROFILE_MARKING)
+ QUACK!
+#endif
+ if (callback)
+ m_visitor->pushTraceCallback(const_cast<void*>(objectPointer), callback);
+}
+
+ALWAYS_INLINE void InlinedGlobalMarkingVisitor::mark(const void* objectPointer, TraceCallback callback)
+{
+ if (!objectPointer)
+ return;
+ GeneralHeapObjectHeader* header = GeneralHeapObjectHeader::fromPayload(objectPointer);
+ visitHeader(header, header->payload(), callback);
+}
+
+ALWAYS_INLINE bool InlinedGlobalMarkingVisitor::ensureMarked(const void* objectPointer)
+{
+ if (!objectPointer)
+ return false;
+#if ENABLE(ASSERT)
+ if (isMarked(objectPointer))
+ return false;
+
+ markNoTracing(objectPointer);
+#else
+ // Inline what the above markNoTracing() call expands to,
+ // so as to make sure that we do get all the benefits.
+ GeneralHeapObjectHeader* header =
+ GeneralHeapObjectHeader::fromPayload(objectPointer);
+ if (header->isMarked())
+ return false;
+ header->mark();
+#endif
+ return true;
+}
+
} // namespace blink
#endif // Heap_h
« no previous file with comments | « Source/core/svg/properties/SVGPropertyHelper.h ('k') | Source/platform/heap/Heap.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698