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

Unified Diff: third_party/WebKit/Source/platform/heap/TraceTraits.h

Issue 2585433003: [wrapper-tracing] Reduce marking overhead: Tri-color marking without 3 colors (Closed)
Patch Set: Remove profiling prints Created 4 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
Index: third_party/WebKit/Source/platform/heap/TraceTraits.h
diff --git a/third_party/WebKit/Source/platform/heap/TraceTraits.h b/third_party/WebKit/Source/platform/heap/TraceTraits.h
index a56ccf1a0f3d4a5cebfea9e0068a3adaed65eb1d..1a28b07e9082965a0e212769133b48cf1865aabe 100644
--- a/third_party/WebKit/Source/platform/heap/TraceTraits.h
+++ b/third_party/WebKit/Source/platform/heap/TraceTraits.h
@@ -47,12 +47,22 @@ class AdjustAndMarkTrait<T, false> {
STATIC_ONLY(AdjustAndMarkTrait);
public:
- static void markWrapper(const WrapperVisitor* visitor, const T* t) {
+ static void fullyMarkAndTraceWrapper(const WrapperVisitor* visitor,
+ const T* t) {
Hannes Payer (out of office) 2016/12/20 15:30:33 DCHECK(!heapObjectHeader(t)->isWrapperHeaderMarked
Michael Lippautz 2016/12/20 15:57:23 This one cannot be done, as it is used when we can
if (visitor->markWrapperHeader(heapObjectHeader(t))) {
visitor->markWrappersInAllWorlds(t);
visitor->dispatchTraceWrappers(t);
}
}
+ static void markWrapperHeaderOnly(const WrapperVisitor* visitor, const T* t) {
Hannes Payer (out of office) 2016/12/20 15:30:33 DCHECK(!heapObjectHeader(t)->isWrapperHeaderMarked
Michael Lippautz 2016/12/20 15:57:23 Done.
+ visitor->markWrapperHeader(heapObjectHeader(t));
+ }
+ static void finishMarkAndTraceMarkedWrapper(const WrapperVisitor* visitor,
+ const T* t) {
+ CHECK(heapObjectHeader(t)->isWrapperHeaderMarked());
Hannes Payer (out of office) 2016/12/20 15:30:34 s/CHECK/DCHECK/
Michael Lippautz 2016/12/20 15:57:23 Most of the assertions will be CHECKs until this i
+ visitor->markWrappersInAllWorlds(t);
+ visitor->dispatchTraceWrappers(t);
+ }
static HeapObjectHeader* heapObjectHeader(const T* t) {
return HeapObjectHeader::fromPayload(t);
}
@@ -99,8 +109,16 @@ class AdjustAndMarkTrait<T, true> {
STATIC_ONLY(AdjustAndMarkTrait);
public:
- static void markWrapper(const WrapperVisitor* visitor, const T* t) {
- t->adjustAndMarkWrapper(visitor);
+ static void fullyMarkAndTraceWrapper(const WrapperVisitor* visitor,
+ const T* t) {
+ t->adjustAndFullyMarkAndTraceWrapper(visitor);
+ }
+ static void markWrapperHeaderOnly(const WrapperVisitor* visitor, const T* t) {
+ t->adjustAndMarkWrapperHeaderOnly(visitor);
+ }
+ static void finishMarkAndTraceMarkedWrapper(const WrapperVisitor* visitor,
+ const T* t) {
+ t->adjustAndFinishMarkAndTraceMarkedWrapper(visitor);
}
static HeapObjectHeader* heapObjectHeader(const T* t) {
return t->adjustAndGetHeapObjectHeader();
@@ -205,11 +223,29 @@ class TraceTrait {
static void trace(Visitor*, void* self);
static void trace(InlinedGlobalMarkingVisitor, void* self);
- static void markWrapper(const WrapperVisitor* visitor, const void* t) {
+ static void fullyMarkAndTraceWrapper(const WrapperVisitor* visitor,
+ const void* t) {
+ static_assert(CanTraceWrappers<T>::value,
+ "T should be able to trace wrappers. See "
+ "dispatchTraceWrappers in WrapperVisitor.h");
+ return AdjustAndMarkTrait<T>::fullyMarkAndTraceWrapper(
+ visitor, reinterpret_cast<const T*>(t));
+ }
+ static void markWrapperHeaderOnly(const WrapperVisitor* visitor,
+ const void* t) {
+ static_assert(CanTraceWrappers<T>::value,
+ "T should be able to trace wrappers. See "
+ "dispatchTraceWrappers in WrapperVisitor.h");
+ return AdjustAndMarkTrait<T>::markWrapperHeaderOnly(
+ visitor, reinterpret_cast<const T*>(t));
+ }
+ static void finishMarkAndTraceMarkedWrapper(const WrapperVisitor* visitor,
+ const void* t) {
static_assert(CanTraceWrappers<T>::value,
"T should be able to trace wrappers. See "
"dispatchTraceWrappers in WrapperVisitor.h");
- AdjustAndMarkTrait<T>::markWrapper(visitor, reinterpret_cast<const T*>(t));
+ AdjustAndMarkTrait<T>::finishMarkAndTraceMarkedWrapper(
+ visitor, reinterpret_cast<const T*>(t));
}
static HeapObjectHeader* heapObjectHeader(const void* t) {
static_assert(CanTraceWrappers<T>::value,

Powered by Google App Engine
This is Rietveld 408576698