| OLD | NEW |
| 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 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 RawObject* raw_obj = handle->raw(); | 440 RawObject* raw_obj = handle->raw(); |
| 441 if (IsUnreachable(raw_obj)) { | 441 if (IsUnreachable(raw_obj)) { |
| 442 handle->UpdateUnreachable(thread()->isolate()); | 442 handle->UpdateUnreachable(thread()->isolate()); |
| 443 } | 443 } |
| 444 } | 444 } |
| 445 | 445 |
| 446 private: | 446 private: |
| 447 DISALLOW_COPY_AND_ASSIGN(MarkingWeakVisitor); | 447 DISALLOW_COPY_AND_ASSIGN(MarkingWeakVisitor); |
| 448 }; | 448 }; |
| 449 | 449 |
| 450 void GCMarker::Prologue(Isolate* isolate, bool invoke_api_callbacks) { | 450 void GCMarker::Prologue(Isolate* isolate) { |
| 451 if (invoke_api_callbacks && (isolate->gc_prologue_callback() != NULL)) { | |
| 452 (isolate->gc_prologue_callback())(); | |
| 453 } | |
| 454 isolate->PrepareForGC(); | 451 isolate->PrepareForGC(); |
| 455 // The store buffers will be rebuilt as part of marking, reset them now. | 452 // The store buffers will be rebuilt as part of marking, reset them now. |
| 456 isolate->store_buffer()->Reset(); | 453 isolate->store_buffer()->Reset(); |
| 457 } | 454 } |
| 458 | 455 |
| 459 void GCMarker::Epilogue(Isolate* isolate, bool invoke_api_callbacks) { | 456 void GCMarker::Epilogue(Isolate* isolate) {} |
| 460 if (invoke_api_callbacks && (isolate->gc_epilogue_callback() != NULL)) { | |
| 461 (isolate->gc_epilogue_callback())(); | |
| 462 } | |
| 463 } | |
| 464 | 457 |
| 465 void GCMarker::IterateRoots(Isolate* isolate, | 458 void GCMarker::IterateRoots(Isolate* isolate, |
| 466 ObjectPointerVisitor* visitor, | 459 ObjectPointerVisitor* visitor, |
| 467 intptr_t slice_index, | 460 intptr_t slice_index, |
| 468 intptr_t num_slices) { | 461 intptr_t num_slices) { |
| 469 ASSERT(0 <= slice_index && slice_index < num_slices); | 462 ASSERT(0 <= slice_index && slice_index < num_slices); |
| 470 if ((slice_index == 0) || (num_slices <= 1)) { | 463 if ((slice_index == 0) || (num_slices <= 1)) { |
| 471 isolate->VisitObjectPointers(visitor, | 464 isolate->VisitObjectPointers(visitor, |
| 472 StackFrameIterator::kDontValidateFrames); | 465 StackFrameIterator::kDontValidateFrames); |
| 473 } | 466 } |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 670 table->UpdateLiveOld(i, size, count); | 663 table->UpdateLiveOld(i, size, count); |
| 671 } | 664 } |
| 672 } | 665 } |
| 673 #endif // !PRODUCT | 666 #endif // !PRODUCT |
| 674 } | 667 } |
| 675 visitor->Finalize(); | 668 visitor->Finalize(); |
| 676 } | 669 } |
| 677 | 670 |
| 678 void GCMarker::MarkObjects(Isolate* isolate, | 671 void GCMarker::MarkObjects(Isolate* isolate, |
| 679 PageSpace* page_space, | 672 PageSpace* page_space, |
| 680 bool invoke_api_callbacks, | |
| 681 bool collect_code) { | 673 bool collect_code) { |
| 682 Prologue(isolate, invoke_api_callbacks); | 674 Prologue(isolate); |
| 683 // The API prologue/epilogue may create/destroy zones, so we must not | 675 // The API prologue/epilogue may create/destroy zones, so we must not |
| 684 // depend on zone allocations surviving beyond the epilogue callback. | 676 // depend on zone allocations surviving beyond the epilogue callback. |
| 685 { | 677 { |
| 686 Thread* thread = Thread::Current(); | 678 Thread* thread = Thread::Current(); |
| 687 StackZone stack_zone(thread); | 679 StackZone stack_zone(thread); |
| 688 Zone* zone = stack_zone.GetZone(); | 680 Zone* zone = stack_zone.GetZone(); |
| 689 MarkingStack marking_stack; | 681 MarkingStack marking_stack; |
| 690 marked_bytes_ = 0; | 682 marked_bytes_ = 0; |
| 691 const int num_tasks = FLAG_marker_tasks; | 683 const int num_tasks = FLAG_marker_tasks; |
| 692 if (num_tasks == 0) { | 684 if (num_tasks == 0) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 IterateWeakRoots(isolate, &mark_weak); | 737 IterateWeakRoots(isolate, &mark_weak); |
| 746 } | 738 } |
| 747 barrier.Sync(); | 739 barrier.Sync(); |
| 748 | 740 |
| 749 // Phase 3: Finalize results from all markers (detach code, etc.). | 741 // Phase 3: Finalize results from all markers (detach code, etc.). |
| 750 barrier.Exit(); | 742 barrier.Exit(); |
| 751 } | 743 } |
| 752 ProcessWeakTables(page_space); | 744 ProcessWeakTables(page_space); |
| 753 ProcessObjectIdTable(isolate); | 745 ProcessObjectIdTable(isolate); |
| 754 } | 746 } |
| 755 Epilogue(isolate, invoke_api_callbacks); | 747 Epilogue(isolate); |
| 756 } | 748 } |
| 757 | 749 |
| 758 } // namespace dart | 750 } // namespace dart |
| OLD | NEW |