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

Side by Side Diff: src/heap/mark-compact.cc

Issue 2032213003: Introduce api for incremental wrapper tracing (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add comment Created 4 years, 6 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 unified diff | Download patch
« no previous file with comments | « src/heap/mark-compact.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/heap/mark-compact.h" 5 #include "src/heap/mark-compact.h"
6 6
7 #include "src/base/atomicops.h" 7 #include "src/base/atomicops.h"
8 #include "src/base/bits.h" 8 #include "src/base/bits.h"
9 #include "src/base/sys-info.h" 9 #include "src/base/sys-info.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 2105 matching lines...) Expand 10 before | Expand all | Expand 10 after
2116 } 2116 }
2117 2117
2118 // Mark all objects reachable (transitively) from objects on the marking 2118 // Mark all objects reachable (transitively) from objects on the marking
2119 // stack including references only considered in the atomic marking pause. 2119 // stack including references only considered in the atomic marking pause.
2120 void MarkCompactCollector::ProcessEphemeralMarking( 2120 void MarkCompactCollector::ProcessEphemeralMarking(
2121 ObjectVisitor* visitor, bool only_process_harmony_weak_collections) { 2121 ObjectVisitor* visitor, bool only_process_harmony_weak_collections) {
2122 DCHECK(marking_deque_.IsEmpty() && !marking_deque_.overflowed()); 2122 DCHECK(marking_deque_.IsEmpty() && !marking_deque_.overflowed());
2123 bool work_to_do = true; 2123 bool work_to_do = true;
2124 while (work_to_do) { 2124 while (work_to_do) {
2125 if (UsingEmbedderHeapTracer()) { 2125 if (UsingEmbedderHeapTracer()) {
2126 embedder_heap_tracer()->TraceWrappersFrom(wrappers_to_trace_); 2126 RegisterWrappersWithEmbedderHeapTracer();
2127 wrappers_to_trace_.clear(); 2127 embedder_heap_tracer()->AdvanceTracing(
2128 0, EmbedderHeapTracer::AdvanceTracingActions(
2129 EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION));
2128 } 2130 }
2129 if (!only_process_harmony_weak_collections) { 2131 if (!only_process_harmony_weak_collections) {
2130 isolate()->global_handles()->IterateObjectGroups( 2132 isolate()->global_handles()->IterateObjectGroups(
2131 visitor, &IsUnmarkedHeapObjectWithHeap); 2133 visitor, &IsUnmarkedHeapObjectWithHeap);
2132 MarkImplicitRefGroups(&MarkCompactMarkingVisitor::MarkObject); 2134 MarkImplicitRefGroups(&MarkCompactMarkingVisitor::MarkObject);
2133 } 2135 }
2134 ProcessWeakCollections(); 2136 ProcessWeakCollections();
2135 work_to_do = !marking_deque_.IsEmpty(); 2137 work_to_do = !marking_deque_.IsEmpty();
2136 ProcessMarkingDeque(); 2138 ProcessMarkingDeque();
2137 } 2139 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
2234 top_ = bottom_ = 0xdecbad; 2236 top_ = bottom_ = 0xdecbad;
2235 in_use_ = false; 2237 in_use_ = false;
2236 } 2238 }
2237 2239
2238 void MarkCompactCollector::SetEmbedderHeapTracer(EmbedderHeapTracer* tracer) { 2240 void MarkCompactCollector::SetEmbedderHeapTracer(EmbedderHeapTracer* tracer) {
2239 DCHECK_NOT_NULL(tracer); 2241 DCHECK_NOT_NULL(tracer);
2240 CHECK_NULL(embedder_heap_tracer_); 2242 CHECK_NULL(embedder_heap_tracer_);
2241 embedder_heap_tracer_ = tracer; 2243 embedder_heap_tracer_ = tracer;
2242 } 2244 }
2243 2245
2246 void MarkCompactCollector::RegisterWrappersWithEmbedderHeapTracer() {
2247 DCHECK(UsingEmbedderHeapTracer());
2248 if (wrappers_to_trace_.empty()) {
2249 return;
2250 }
2251 embedder_heap_tracer()->RegisterV8References(wrappers_to_trace_);
2252 wrappers_to_trace_.clear();
2253 }
2254
2244 void MarkCompactCollector::TracePossibleWrapper(JSObject* js_object) { 2255 void MarkCompactCollector::TracePossibleWrapper(JSObject* js_object) {
2245 DCHECK(js_object->WasConstructedFromApiFunction()); 2256 DCHECK(js_object->WasConstructedFromApiFunction());
2246 if (js_object->GetInternalFieldCount() >= 2 && 2257 if (js_object->GetInternalFieldCount() >= 2 &&
2247 js_object->GetInternalField(0) && 2258 js_object->GetInternalField(0) &&
2248 js_object->GetInternalField(0) != heap_->undefined_value() && 2259 js_object->GetInternalField(0) != heap_->undefined_value() &&
2249 js_object->GetInternalField(1) != heap_->undefined_value()) { 2260 js_object->GetInternalField(1) != heap_->undefined_value()) {
2250 DCHECK(reinterpret_cast<intptr_t>(js_object->GetInternalField(0)) % 2 == 0); 2261 DCHECK(reinterpret_cast<intptr_t>(js_object->GetInternalField(0)) % 2 == 0);
2251 wrappers_to_trace().push_back(std::pair<void*, void*>( 2262 wrappers_to_trace_.push_back(std::pair<void*, void*>(
2252 reinterpret_cast<void*>(js_object->GetInternalField(0)), 2263 reinterpret_cast<void*>(js_object->GetInternalField(0)),
2253 reinterpret_cast<void*>(js_object->GetInternalField(1)))); 2264 reinterpret_cast<void*>(js_object->GetInternalField(1))));
2254 } 2265 }
2255 } 2266 }
2256 2267
2257 void MarkCompactCollector::RegisterExternallyReferencedObject(Object** object) { 2268 void MarkCompactCollector::RegisterExternallyReferencedObject(Object** object) {
2258 DCHECK(in_use()); 2269 DCHECK(in_use());
2259 HeapObject* heap_object = HeapObject::cast(*object); 2270 HeapObject* heap_object = HeapObject::cast(*object);
2260 DCHECK(heap_->Contains(heap_object)); 2271 DCHECK(heap_->Contains(heap_object));
2261 MarkBit mark_bit = Marking::MarkBitFrom(heap_object); 2272 MarkBit mark_bit = Marking::MarkBitFrom(heap_object);
(...skipping 1723 matching lines...) Expand 10 before | Expand all | Expand 10 after
3985 MarkBit mark_bit = Marking::MarkBitFrom(host); 3996 MarkBit mark_bit = Marking::MarkBitFrom(host);
3986 if (Marking::IsBlack(mark_bit)) { 3997 if (Marking::IsBlack(mark_bit)) {
3987 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); 3998 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host);
3988 RecordRelocSlot(host, &rinfo, target); 3999 RecordRelocSlot(host, &rinfo, target);
3989 } 4000 }
3990 } 4001 }
3991 } 4002 }
3992 4003
3993 } // namespace internal 4004 } // namespace internal
3994 } // namespace v8 4005 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/mark-compact.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698