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

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

Issue 2010673002: Add timeline event for weak handle processing. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 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 | « no previous file | runtime/vm/scavenger.cc » ('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 "vm/allocation.h" 7 #include "vm/allocation.h"
8 #include "vm/dart_api_state.h" 8 #include "vm/dart_api_state.h"
9 #include "vm/isolate.h" 9 #include "vm/isolate.h"
10 #include "vm/log.h" 10 #include "vm/log.h"
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 645
646 646
647 void GCMarker::MarkObjects(Isolate* isolate, 647 void GCMarker::MarkObjects(Isolate* isolate,
648 PageSpace* page_space, 648 PageSpace* page_space,
649 bool invoke_api_callbacks, 649 bool invoke_api_callbacks,
650 bool collect_code) { 650 bool collect_code) {
651 Prologue(isolate, invoke_api_callbacks); 651 Prologue(isolate, invoke_api_callbacks);
652 // The API prologue/epilogue may create/destroy zones, so we must not 652 // The API prologue/epilogue may create/destroy zones, so we must not
653 // depend on zone allocations surviving beyond the epilogue callback. 653 // depend on zone allocations surviving beyond the epilogue callback.
654 { 654 {
655 StackZone stack_zone(Thread::Current()); 655 Thread* thread = Thread::Current();
656 StackZone stack_zone(thread);
656 Zone* zone = stack_zone.GetZone(); 657 Zone* zone = stack_zone.GetZone();
657 MarkingStack marking_stack; 658 MarkingStack marking_stack;
658 marked_bytes_ = 0; 659 marked_bytes_ = 0;
659 const int num_tasks = FLAG_marker_tasks; 660 const int num_tasks = FLAG_marker_tasks;
660 if (num_tasks == 0) { 661 if (num_tasks == 0) {
661 // Mark everything on main thread. 662 // Mark everything on main thread.
662 SkippedCodeFunctions* skipped_code_functions = 663 SkippedCodeFunctions* skipped_code_functions =
663 collect_code ? new(zone) SkippedCodeFunctions() : NULL; 664 collect_code ? new(zone) SkippedCodeFunctions() : NULL;
664 UnsyncMarkingVisitor mark(isolate, heap_, page_space, &marking_stack, 665 UnsyncMarkingVisitor mark(isolate, heap_, page_space, &marking_stack,
665 skipped_code_functions); 666 skipped_code_functions);
666 IterateRoots(isolate, &mark, 0, 1); 667 IterateRoots(isolate, &mark, 0, 1);
667 mark.DrainMarkingStack(); 668 mark.DrainMarkingStack();
668 MarkingWeakVisitor mark_weak; 669 {
669 IterateWeakRoots(isolate, &mark_weak); 670 TIMELINE_FUNCTION_GC_DURATION(thread, "WeakHandleProcessing");
671 MarkingWeakVisitor mark_weak;
672 IterateWeakRoots(isolate, &mark_weak);
673 }
670 // All marking done; detach code, etc. 674 // All marking done; detach code, etc.
671 FinalizeResultsFrom(&mark); 675 FinalizeResultsFrom(&mark);
672 } else { 676 } else {
673 ThreadBarrier barrier(num_tasks + 1, 677 ThreadBarrier barrier(num_tasks + 1,
674 heap_->barrier(), 678 heap_->barrier(),
675 heap_->barrier_done()); 679 heap_->barrier_done());
676 // Used to coordinate draining among tasks; all start out as 'busy'. 680 // Used to coordinate draining among tasks; all start out as 'busy'.
677 uintptr_t num_busy = num_tasks; 681 uintptr_t num_busy = num_tasks;
678 // Phase 1: Iterate over roots and drain marking stack in tasks. 682 // Phase 1: Iterate over roots and drain marking stack in tasks.
679 for (intptr_t i = 0; i < num_tasks; ++i) { 683 for (intptr_t i = 0; i < num_tasks; ++i) {
680 MarkTask* mark_task = 684 MarkTask* mark_task =
681 new MarkTask(this, isolate, heap_, page_space, &marking_stack, 685 new MarkTask(this, isolate, heap_, page_space, &marking_stack,
682 &barrier, collect_code, 686 &barrier, collect_code,
683 i, num_tasks, &num_busy); 687 i, num_tasks, &num_busy);
684 ThreadPool* pool = Dart::thread_pool(); 688 ThreadPool* pool = Dart::thread_pool();
685 pool->Run(mark_task); 689 pool->Run(mark_task);
686 } 690 }
687 barrier.Sync(); 691 barrier.Sync();
688 692
689 // Phase 2: Weak processing on main thread. 693 // Phase 2: Weak processing on main thread.
690 MarkingWeakVisitor mark_weak; 694 {
691 IterateWeakRoots(isolate, &mark_weak); 695 TIMELINE_FUNCTION_GC_DURATION(thread, "WeakHandleProcessing");
696 MarkingWeakVisitor mark_weak;
697 IterateWeakRoots(isolate, &mark_weak);
698 }
692 barrier.Sync(); 699 barrier.Sync();
693 700
694 // Phase 3: Finalize results from all markers (detach code, etc.). 701 // Phase 3: Finalize results from all markers (detach code, etc.).
695 barrier.Exit(); 702 barrier.Exit();
696 } 703 }
697 ProcessWeakTables(page_space); 704 ProcessWeakTables(page_space);
698 ProcessObjectIdTable(isolate); 705 ProcessObjectIdTable(isolate);
699 } 706 }
700 Epilogue(isolate, invoke_api_callbacks); 707 Epilogue(isolate, invoke_api_callbacks);
701 } 708 }
702 709
703 } // namespace dart 710 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/scavenger.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698