OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 #define DEFINE_INLINE_TRACE_AFTER_DISPATCH() \ | 87 #define DEFINE_INLINE_TRACE_AFTER_DISPATCH() \ |
88 void traceAfterDispatch(blink::Visitor* visitor) | 88 void traceAfterDispatch(blink::Visitor* visitor) |
89 | 89 |
90 #define EMPTY_MACRO_ARGUMENT | 90 #define EMPTY_MACRO_ARGUMENT |
91 | 91 |
92 #define DECLARE_TRACE() DECLARE_TRACE_IMPL(EMPTY_MACRO_ARGUMENT) | 92 #define DECLARE_TRACE() DECLARE_TRACE_IMPL(EMPTY_MACRO_ARGUMENT) |
93 #define DECLARE_VIRTUAL_TRACE() DECLARE_TRACE_IMPL(virtual) | 93 #define DECLARE_VIRTUAL_TRACE() DECLARE_TRACE_IMPL(virtual) |
94 #define DEFINE_INLINE_TRACE() DEFINE_INLINE_TRACE_IMPL(EMPTY_MACRO_ARGUMENT) | 94 #define DEFINE_INLINE_TRACE() DEFINE_INLINE_TRACE_IMPL(EMPTY_MACRO_ARGUMENT) |
95 #define DEFINE_INLINE_VIRTUAL_TRACE() DEFINE_INLINE_TRACE_IMPL(virtual) | 95 #define DEFINE_INLINE_VIRTUAL_TRACE() DEFINE_INLINE_TRACE_IMPL(virtual) |
96 | 96 |
97 enum class VisitorMarkingMode { | |
98 // This is a default visitor. This is used for GCType=GCWithSweep | |
99 // and GCType=GCWithoutSweep. | |
100 GlobalMarking, | |
101 // This visitor just marks objects and ignores weak processing. | |
102 // This is used for GCType=TakeSnapshot. | |
103 SnapshotMarking, | |
104 // This visitor is used to trace objects during weak processing. | |
105 // This visitor is allowed to trace only already marked objects. | |
106 WeakProcessing, | |
107 // Perform global marking along with preparing for additional sweep | |
108 // compaction of heap arenas afterwards. Compared to the GlobalMarking | |
109 // visitor, this visitor will also register references to objects | |
110 // that might be moved during arena compaction -- the compaction | |
111 // pass will then fix up those references when the object move goes | |
112 // ahead. | |
113 GlobalMarkingWithCompaction, | |
114 }; | |
115 | |
116 // Visitor is used to traverse the Blink object graph. Used for the | 97 // Visitor is used to traverse the Blink object graph. Used for the |
117 // marking phase of the mark-sweep garbage collector. | 98 // marking phase of the mark-sweep garbage collector. |
118 // | 99 // |
119 // Pointers are marked and pushed on the marking stack by calling the | 100 // Pointers are marked and pushed on the marking stack by calling the |
120 // |mark| method with the pointer as an argument. | 101 // |mark| method with the pointer as an argument. |
121 // | 102 // |
122 // Pointers within objects are traced by calling the |trace| methods | 103 // Pointers within objects are traced by calling the |trace| methods |
123 // with the object as an argument. Tracing objects will mark all of the | 104 // with the object as an argument. Tracing objects will mark all of the |
124 // contained pointers and push them on the marking stack. | 105 // contained pointers and push them on the marking stack. |
125 class PLATFORM_EXPORT Visitor { | 106 class PLATFORM_EXPORT Visitor { |
126 public: | 107 public: |
127 static std::unique_ptr<Visitor> create(ThreadState*, VisitorMarkingMode); | 108 enum MarkingMode { |
| 109 // This is a default visitor. This is used for GCType=GCWithSweep |
| 110 // and GCType=GCWithoutSweep. |
| 111 GlobalMarking, |
| 112 // This visitor just marks objects and ignores weak processing. |
| 113 // This is used for GCType=TakeSnapshot. |
| 114 SnapshotMarking, |
| 115 // This visitor is used to trace objects during weak processing. |
| 116 // This visitor is allowed to trace only already marked objects. |
| 117 WeakProcessing, |
| 118 // Perform global marking along with preparing for additional sweep |
| 119 // compaction of heap arenas afterwards. Compared to the GlobalMarking |
| 120 // visitor, this visitor will also register references to objects |
| 121 // that might be moved during arena compaction -- the compaction |
| 122 // pass will then fix up those references when the object move goes |
| 123 // ahead. |
| 124 GlobalMarkingWithCompaction, |
| 125 }; |
128 | 126 |
129 Visitor(ThreadState*, VisitorMarkingMode); | 127 static std::unique_ptr<Visitor> create(ThreadState*, MarkingMode); |
| 128 |
| 129 Visitor(ThreadState*, MarkingMode); |
130 virtual ~Visitor(); | 130 virtual ~Visitor(); |
131 | 131 |
132 // One-argument templated mark method. This uses the static type of | 132 // One-argument templated mark method. This uses the static type of |
133 // the argument to get the TraceTrait. By default, the mark method | 133 // the argument to get the TraceTrait. By default, the mark method |
134 // of the TraceTrait just calls the virtual two-argument mark method on this | 134 // of the TraceTrait just calls the virtual two-argument mark method on this |
135 // visitor, where the second argument is the static trace method of the trait. | 135 // visitor, where the second argument is the static trace method of the trait. |
136 template <typename T> | 136 template <typename T> |
137 void mark(T* t) { | 137 void mark(T* t) { |
138 static_assert(sizeof(T), "T must be fully defined"); | 138 static_assert(sizeof(T), "T must be fully defined"); |
139 static_assert(IsGarbageCollectedType<T>::value, | 139 static_assert(IsGarbageCollectedType<T>::value, |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 // Used to mark objects during conservative scanning. | 303 // Used to mark objects during conservative scanning. |
304 inline void markHeader(HeapObjectHeader*, | 304 inline void markHeader(HeapObjectHeader*, |
305 const void* objectPointer, | 305 const void* objectPointer, |
306 TraceCallback); | 306 TraceCallback); |
307 | 307 |
308 inline void markHeader(HeapObjectHeader*, TraceCallback); | 308 inline void markHeader(HeapObjectHeader*, TraceCallback); |
309 | 309 |
310 inline ThreadState* state() const { return m_state; } | 310 inline ThreadState* state() const { return m_state; } |
311 inline ThreadHeap& heap() const { return state()->heap(); } | 311 inline ThreadHeap& heap() const { return state()->heap(); } |
312 | 312 |
313 inline VisitorMarkingMode getMarkingMode() const { return m_markingMode; } | 313 inline MarkingMode getMarkingMode() const { return m_markingMode; } |
314 | 314 |
315 private: | 315 private: |
316 template <typename T> | 316 template <typename T> |
317 static void handleWeakCell(Visitor* self, void*); | 317 static void handleWeakCell(Visitor* self, void*); |
318 | 318 |
319 static void markNoTracingCallback(Visitor*, void*); | 319 static void markNoTracingCallback(Visitor*, void*); |
320 | 320 |
321 ThreadState* const m_state; | 321 ThreadState* const m_state; |
322 const VisitorMarkingMode m_markingMode; | 322 const MarkingMode m_markingMode; |
323 }; | 323 }; |
324 | 324 |
325 } // namespace blink | 325 } // namespace blink |
326 | 326 |
327 #endif // Visitor_h | 327 #endif // Visitor_h |
OLD | NEW |