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

Side by Side Diff: runtime/vm/gc_marker.cc

Issue 1168483003: Thread-local store buffers, v2 (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Address review comments. Created 5 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 | « runtime/vm/assembler_test.cc ('k') | runtime/vm/isolate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/gc_marker.h" 5 #include "vm/gc_marker.h"
6 6
7 #include <map> 7 #include <map>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 121
122 122
123 class MarkingVisitor : public ObjectPointerVisitor { 123 class MarkingVisitor : public ObjectPointerVisitor {
124 public: 124 public:
125 MarkingVisitor(Isolate* isolate, 125 MarkingVisitor(Isolate* isolate,
126 Heap* heap, 126 Heap* heap,
127 PageSpace* page_space, 127 PageSpace* page_space,
128 MarkingStack* marking_stack, 128 MarkingStack* marking_stack,
129 bool visit_function_code) 129 bool visit_function_code)
130 : ObjectPointerVisitor(isolate), 130 : ObjectPointerVisitor(isolate),
131 thread_(Thread::Current()),
131 heap_(heap), 132 heap_(heap),
132 vm_heap_(Dart::vm_isolate()->heap()), 133 vm_heap_(Dart::vm_isolate()->heap()),
133 class_table_(isolate->class_table()), 134 class_table_(isolate->class_table()),
134 page_space_(page_space), 135 page_space_(page_space),
135 marking_stack_(marking_stack), 136 marking_stack_(marking_stack),
136 visiting_old_object_(NULL), 137 visiting_old_object_(NULL),
137 visit_function_code_(visit_function_code) { 138 visit_function_code_(visit_function_code) {
138 ASSERT(heap_ != vm_heap_); 139 ASSERT(heap_ != vm_heap_);
140 ASSERT(thread_->isolate() == isolate);
139 } 141 }
140 142
141 MarkingStack* marking_stack() const { return marking_stack_; } 143 MarkingStack* marking_stack() const { return marking_stack_; }
142 144
143 void VisitPointers(RawObject** first, RawObject** last) { 145 void VisitPointers(RawObject** first, RawObject** last) {
144 for (RawObject** current = first; current <= last; current++) { 146 for (RawObject** current = first; current <= last; current++) {
145 MarkObject(*current, current); 147 MarkObject(*current, current);
146 } 148 }
147 } 149 }
148 150
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 return; 221 return;
220 } 222 }
221 223
222 // Skip over new objects, but verify consistency of heap while at it. 224 // Skip over new objects, but verify consistency of heap while at it.
223 if (raw_obj->IsNewObject()) { 225 if (raw_obj->IsNewObject()) {
224 // TODO(iposva): Add consistency check. 226 // TODO(iposva): Add consistency check.
225 if ((visiting_old_object_ != NULL) && 227 if ((visiting_old_object_ != NULL) &&
226 !visiting_old_object_->IsRemembered()) { 228 !visiting_old_object_->IsRemembered()) {
227 ASSERT(p != NULL); 229 ASSERT(p != NULL);
228 visiting_old_object_->SetRememberedBitUnsynchronized(); 230 visiting_old_object_->SetRememberedBitUnsynchronized();
229 isolate()->store_buffer()->AddObjectGC(visiting_old_object_); 231 thread_->StoreBufferAddObjectGC(visiting_old_object_);
230 } 232 }
231 return; 233 return;
232 } 234 }
233 if (RawObject::IsVariableSizeClassId(raw_obj->GetClassId())) { 235 if (RawObject::IsVariableSizeClassId(raw_obj->GetClassId())) {
234 class_table_->UpdateLiveOld(raw_obj->GetClassId(), raw_obj->Size()); 236 class_table_->UpdateLiveOld(raw_obj->GetClassId(), raw_obj->Size());
235 } else { 237 } else {
236 class_table_->UpdateLiveOld(raw_obj->GetClassId(), 0); 238 class_table_->UpdateLiveOld(raw_obj->GetClassId(), 0);
237 } 239 }
238 240
239 MarkAndPush(raw_obj); 241 MarkAndPush(raw_obj);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 } 280 }
279 } 281 }
280 } 282 }
281 if (FLAG_log_code_drop) { 283 if (FLAG_log_code_drop) {
282 ISL_Print(" total detached current: %" Pd "\n", current_code_count); 284 ISL_Print(" total detached current: %" Pd "\n", current_code_count);
283 ISL_Print(" total detached unoptimized: %" Pd "\n", 285 ISL_Print(" total detached unoptimized: %" Pd "\n",
284 unoptimized_code_count); 286 unoptimized_code_count);
285 } 287 }
286 } 288 }
287 289
290 Thread* thread_;
288 Heap* heap_; 291 Heap* heap_;
289 Heap* vm_heap_; 292 Heap* vm_heap_;
290 ClassTable* class_table_; 293 ClassTable* class_table_;
291 PageSpace* page_space_; 294 PageSpace* page_space_;
292 MarkingStack* marking_stack_; 295 MarkingStack* marking_stack_;
293 RawObject* visiting_old_object_; 296 RawObject* visiting_old_object_;
294 typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet; 297 typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet;
295 typedef std::pair<RawObject*, RawWeakProperty*> DelaySetEntry; 298 typedef std::pair<RawObject*, RawWeakProperty*> DelaySetEntry;
296 DelaySet delay_set_; 299 DelaySet delay_set_;
297 const bool visit_function_code_; 300 const bool visit_function_code_;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 334
332 private: 335 private:
333 DISALLOW_COPY_AND_ASSIGN(MarkingWeakVisitor); 336 DISALLOW_COPY_AND_ASSIGN(MarkingWeakVisitor);
334 }; 337 };
335 338
336 339
337 void GCMarker::Prologue(Isolate* isolate, bool invoke_api_callbacks) { 340 void GCMarker::Prologue(Isolate* isolate, bool invoke_api_callbacks) {
338 if (invoke_api_callbacks && (isolate->gc_prologue_callback() != NULL)) { 341 if (invoke_api_callbacks && (isolate->gc_prologue_callback() != NULL)) {
339 (isolate->gc_prologue_callback())(); 342 (isolate->gc_prologue_callback())();
340 } 343 }
344 Thread::PrepareForGC();
341 // The store buffers will be rebuilt as part of marking, reset them now. 345 // The store buffers will be rebuilt as part of marking, reset them now.
342 isolate->store_buffer()->Reset(); 346 isolate->store_buffer()->Reset();
343 } 347 }
344 348
345 349
346 void GCMarker::Epilogue(Isolate* isolate, bool invoke_api_callbacks) { 350 void GCMarker::Epilogue(Isolate* isolate, bool invoke_api_callbacks) {
347 if (invoke_api_callbacks && (isolate->gc_epilogue_callback() != NULL)) { 351 if (invoke_api_callbacks && (isolate->gc_epilogue_callback() != NULL)) {
348 (isolate->gc_epilogue_callback())(); 352 (isolate->gc_epilogue_callback())();
349 } 353 }
350 } 354 }
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 MarkingWeakVisitor mark_weak; 538 MarkingWeakVisitor mark_weak;
535 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); 539 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks);
536 mark.Finalize(); 540 mark.Finalize();
537 ProcessWeakTables(page_space); 541 ProcessWeakTables(page_space);
538 ProcessObjectIdTable(isolate); 542 ProcessObjectIdTable(isolate);
539 } 543 }
540 Epilogue(isolate, invoke_api_callbacks); 544 Epilogue(isolate, invoke_api_callbacks);
541 } 545 }
542 546
543 } // namespace dart 547 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/assembler_test.cc ('k') | runtime/vm/isolate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698