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

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

Issue 783823002: Oilpan: enable eager tracing. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Tidying + add a test for marking stack fallback 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/platform/heap/HeapTest.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/heap/Visitor.h
diff --git a/Source/platform/heap/Visitor.h b/Source/platform/heap/Visitor.h
index dcd07cfff5143b87feaebf66c63daaf9f6d5e3aa..0df33b31f5ee31b9744f960c6dd20ac52c1abca8 100644
--- a/Source/platform/heap/Visitor.h
+++ b/Source/platform/heap/Visitor.h
@@ -191,58 +191,51 @@ public:
template<typename T> class TraceTrait<const T> : public TraceTrait<T> { };
-// If ENABLE_EAGER_TRACING_BY_DEFAULT is set to 1, GCed objects will
-// be eagerly traced by default. A class type can opt out by declaring
-// a TraceEagerlyTrait<> specialization, mapping the value to 'false'
-// (see the WILL_NOT_BE_EAGERLY_TRACED() macro below.)
-#define ENABLE_EAGER_TRACING_BY_DEFAULT 0
-
-// DISABLE_ALL_EAGER_TRACING provides the "kill switch" for eager
-// tracing; setting it to 1 will disable the use of eager tracing
-// entirely. That is, eager tracing is disabled even if traits have
-// been declared.
-#define DISABLE_ALL_EAGER_TRACING 0
-
-// If TraceEagerlyTrait<T>::value is true, then the marker thread should
-// invoke trace() on not-yet-marked objects deriving from class T right
-// away, and not queue their trace callbacks on its marker stack.
+// If MARKER_EAGER_TRACING is set to 1, a marker thread is allowed
+// to directly invoke the trace() method of not-as-yet marked objects upon
+// marking. If it is set to 0, the |trace()| callback for an object will
+// be pushed onto an explicit mark stack, which the marker proceeds to
+// iteratively pop and invoke. The eager scheme enables inlining of a trace()
+// method inside another, the latter keeps system call stack usage bounded
+// and under explicit control.
//
-// Specific template specializations of TraceEagerlyTrait<T> can be used
-// to declare that eager tracing should always be used when tracing over
-// GCed objects with class type T. If the trait's boolean 'value' is
-// mapped to 'true' that is; declare it as 'false' to disable eager tracing.
+// If eager tracing leads to excessively deep |trace()| call chains (and
+// the system stack usage that this brings), the marker implementation will
+// switch to using an explicit mark stack. Recursive and deep object graphs
+// are uncommon for Blink objects.
+//
+// A class type can opt out of eager tracing by declaring a TraceEagerlyTrait<>
+// specialization, mapping the trait's |value| to |false| (see the
+// WILL_NOT_BE_EAGERLY_TRACED() macros below.) For Blink, this is done for
+// the small set of GCed classes that are directly recursive.
+#define MARKER_EAGER_TRACING 1
+
+// The TraceEagerlyTrait<T> trait controls whether or not a class
+// (and its subclasses) should be eagerly traced or not.
+//
+// If |TraceEagerlyTrait<T>::value| is |true|, then the marker thread
+// should invoke |trace()| on not-yet-marked objects deriving from class T
+// right away, and not queue their trace callbacks on its marker stack,
+// which it will do if |value| is |false|.
//
// The trait can be declared to enable/disable eager tracing for a class T
-// and any of its subclasses, or just to the class T (but none of its subclasses.)
+// and any of its subclasses, or just to the class T, but none of its
+// subclasses.
//
template<typename T, typename Enabled = void>
class TraceEagerlyTrait {
public:
- static const bool value = ENABLE_EAGER_TRACING_BY_DEFAULT;
+ static const bool value = MARKER_EAGER_TRACING;
};
-#define WILL_BE_EAGERLY_TRACED(TYPE) \
-template<typename U> \
-class TraceEagerlyTrait<U, typename WTF::EnableIf<WTF::IsSubclass<U, TYPE>::value>::Type> { \
-public: \
- static const bool value = true; \
-}
-
#define WILL_NOT_BE_EAGERLY_TRACED(TYPE) \
-template<typename U> \
-class TraceEagerlyTrait<U, typename WTF::EnableIf<WTF::IsSubclass<U, TYPE>::value>::Type> { \
+template<typename T> \
+class TraceEagerlyTrait<T, typename WTF::EnableIf<WTF::IsSubclass<T, TYPE>::value>::Type> { \
public: \
static const bool value = false; \
}
-// Limit eager tracing to only apply to TYPE (but not any of its subclasses.)
-#define WILL_BE_EAGERLY_TRACED_CLASS(TYPE) \
-template<> \
-class TraceEagerlyTrait<TYPE> { \
-public: \
- static const bool value = true; \
-}
-
+// Disable eager tracing for TYPE, but not any of its subclasses.
#define WILL_NOT_BE_EAGERLY_TRACED_CLASS(TYPE) \
template<> \
class TraceEagerlyTrait<TYPE> { \
@@ -250,16 +243,6 @@ public: \
static const bool value = false; \
}
-// Set to 1 if you want collections to be eagerly traced regardless
-// of whether the elements are eagerly traceable or not.
-#define ENABLE_EAGER_HEAP_COLLECTION_TRACING ENABLE_EAGER_TRACING_BY_DEFAULT
-
-#if ENABLE_EAGER_HEAP_COLLECTION_TRACING
-#define IS_EAGERLY_TRACED_HEAP_COLLECTION(Type) true
-#else
-#define IS_EAGERLY_TRACED_HEAP_COLLECTION(Type) TraceEagerlyTrait<Type>::value
-#endif
-
template<typename Collection>
struct OffHeapCollectionTraceTrait;
@@ -586,7 +569,7 @@ public:
//
// If the trait allows it, invoke the trace callback right here on the
// not-yet-marked object.
- if (!DISABLE_ALL_EAGER_TRACING && TraceEagerlyTrait<T>::value) {
+ if (TraceEagerlyTrait<T>::value) {
// Protect against too deep trace call chains, and the
// unbounded system stack usage they can bring about.
//
@@ -697,7 +680,7 @@ public: \
{ \
typedef WTF::IsSubclassOfTemplate<typename WTF::RemoveConst<TYPE>::Type, blink::GarbageCollected> IsSubclassOfGarbageCollected; \
COMPILE_ASSERT(IsSubclassOfGarbageCollected::value, OnlyGarbageCollectedObjectsCanHaveGarbageCollectedMixins); \
- if (!DISABLE_ALL_EAGER_TRACING && TraceEagerlyTrait<TYPE>::value) { \
+ if (TraceEagerlyTrait<TYPE>::value) { \
if (visitor->ensureMarked(static_cast<const TYPE*>(this))) \
TraceTrait<TYPE>::trace(visitor, const_cast<TYPE*>(this)); \
return; \
« no previous file with comments | « Source/platform/heap/HeapTest.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698