OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/pages.h" | 5 #include "vm/pages.h" |
6 | 6 |
7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
8 #include "vm/compiler_stats.h" | 8 #include "vm/compiler_stats.h" |
9 #include "vm/gc_marker.h" | 9 #include "vm/gc_marker.h" |
10 #include "vm/gc_sweeper.h" | 10 #include "vm/gc_sweeper.h" |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 } | 441 } |
442 HeapPage* page() const { return page_; } | 442 HeapPage* page() const { return page_; } |
443 bool Done() const { return page_ == NULL; } | 443 bool Done() const { return page_ == NULL; } |
444 void Advance() { | 444 void Advance() { |
445 ASSERT(!Done()); | 445 ASSERT(!Done()); |
446 page_ = space_->NextPageAnySize(page_); | 446 page_ = space_->NextPageAnySize(page_); |
447 } | 447 } |
448 private: | 448 private: |
449 const PageSpace* space_; | 449 const PageSpace* space_; |
450 MutexLocker ml_; | 450 MutexLocker ml_; |
451 NoGCScope no_gc; | 451 NoSafepointScope no_safepoint; |
452 HeapPage* page_; | 452 HeapPage* page_; |
453 }; | 453 }; |
454 | 454 |
455 | 455 |
456 // Provides exclusive access to code pages, and ensures they are walkable. | 456 // Provides exclusive access to code pages, and ensures they are walkable. |
457 // NOTE: This does not iterate over large pages which can contain code. | 457 // NOTE: This does not iterate over large pages which can contain code. |
458 class ExclusiveCodePageIterator : ValueObject { | 458 class ExclusiveCodePageIterator : ValueObject { |
459 public: | 459 public: |
460 explicit ExclusiveCodePageIterator(const PageSpace* space) | 460 explicit ExclusiveCodePageIterator(const PageSpace* space) |
461 : space_(space), ml_(space->pages_lock_) { | 461 : space_(space), ml_(space->pages_lock_) { |
462 space_->MakeIterable(); | 462 space_->MakeIterable(); |
463 page_ = space_->exec_pages_; | 463 page_ = space_->exec_pages_; |
464 } | 464 } |
465 HeapPage* page() const { return page_; } | 465 HeapPage* page() const { return page_; } |
466 bool Done() const { return page_ == NULL; } | 466 bool Done() const { return page_ == NULL; } |
467 void Advance() { | 467 void Advance() { |
468 ASSERT(!Done()); | 468 ASSERT(!Done()); |
469 page_ = page_->next(); | 469 page_ = page_->next(); |
470 } | 470 } |
471 private: | 471 private: |
472 const PageSpace* space_; | 472 const PageSpace* space_; |
473 MutexLocker ml_; | 473 MutexLocker ml_; |
474 NoGCScope no_gc; | 474 NoSafepointScope no_safepoint; |
475 HeapPage* page_; | 475 HeapPage* page_; |
476 }; | 476 }; |
477 | 477 |
478 | 478 |
479 // Provides exclusive access to large pages, and ensures they are walkable. | 479 // Provides exclusive access to large pages, and ensures they are walkable. |
480 class ExclusiveLargePageIterator : ValueObject { | 480 class ExclusiveLargePageIterator : ValueObject { |
481 public: | 481 public: |
482 explicit ExclusiveLargePageIterator(const PageSpace* space) | 482 explicit ExclusiveLargePageIterator(const PageSpace* space) |
483 : space_(space), ml_(space->pages_lock_) { | 483 : space_(space), ml_(space->pages_lock_) { |
484 space_->MakeIterable(); | 484 space_->MakeIterable(); |
485 page_ = space_->large_pages_; | 485 page_ = space_->large_pages_; |
486 } | 486 } |
487 HeapPage* page() const { return page_; } | 487 HeapPage* page() const { return page_; } |
488 bool Done() const { return page_ == NULL; } | 488 bool Done() const { return page_ == NULL; } |
489 void Advance() { | 489 void Advance() { |
490 ASSERT(!Done()); | 490 ASSERT(!Done()); |
491 page_ = page_->next(); | 491 page_ = page_->next(); |
492 } | 492 } |
493 private: | 493 private: |
494 const PageSpace* space_; | 494 const PageSpace* space_; |
495 MutexLocker ml_; | 495 MutexLocker ml_; |
496 NoGCScope no_gc; | 496 NoSafepointScope no_safepoint; |
497 HeapPage* page_; | 497 HeapPage* page_; |
498 }; | 498 }; |
499 | 499 |
500 | 500 |
501 void PageSpace::MakeIterable() const { | 501 void PageSpace::MakeIterable() const { |
502 // Assert not called from concurrent sweeper task. | 502 // Assert not called from concurrent sweeper task. |
503 // TODO(koda): Use thread/task identity when implemented. | 503 // TODO(koda): Use thread/task identity when implemented. |
504 ASSERT(Isolate::Current()->heap() != NULL); | 504 ASSERT(Isolate::Current()->heap() != NULL); |
505 if (bump_top_ < bump_end_) { | 505 if (bump_top_ < bump_end_) { |
506 FreeListElement::AsElement(bump_top_, bump_end_ - bump_top_); | 506 FreeListElement::AsElement(bump_top_, bump_end_ - bump_top_); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
663 { | 663 { |
664 JSONObject class_list(&heap_map, "class_list"); | 664 JSONObject class_list(&heap_map, "class_list"); |
665 isolate->class_table()->PrintToJSONObject(&class_list); | 665 isolate->class_table()->PrintToJSONObject(&class_list); |
666 } | 666 } |
667 { | 667 { |
668 // "pages" is an array [page0, page1, ..., pageN], each page of the form | 668 // "pages" is an array [page0, page1, ..., pageN], each page of the form |
669 // {"object_start": "0x...", "objects": [size, class id, size, ...]} | 669 // {"object_start": "0x...", "objects": [size, class id, size, ...]} |
670 // TODO(19445): Use ExclusivePageIterator once HeapMap supports large pages. | 670 // TODO(19445): Use ExclusivePageIterator once HeapMap supports large pages. |
671 MutexLocker ml(pages_lock_); | 671 MutexLocker ml(pages_lock_); |
672 MakeIterable(); | 672 MakeIterable(); |
673 NoGCScope no_gc; | 673 NoSafepointScope no_safepoint; |
674 JSONArray all_pages(&heap_map, "pages"); | 674 JSONArray all_pages(&heap_map, "pages"); |
675 for (HeapPage* page = pages_; page != NULL; page = page->next()) { | 675 for (HeapPage* page = pages_; page != NULL; page = page->next()) { |
676 JSONObject page_container(&all_pages); | 676 JSONObject page_container(&all_pages); |
677 page_container.AddPropertyF("object_start", | 677 page_container.AddPropertyF("object_start", |
678 "0x%" Px "", page->object_start()); | 678 "0x%" Px "", page->object_start()); |
679 JSONArray page_map(&page_container, "objects"); | 679 JSONArray page_map(&page_container, "objects"); |
680 HeapMapAsJSONVisitor printer(&page_map); | 680 HeapMapAsJSONVisitor printer(&page_map); |
681 page->VisitObjects(&printer); | 681 page->VisitObjects(&printer); |
682 } | 682 } |
683 for (HeapPage* page = exec_pages_; page != NULL; page = page->next()) { | 683 for (HeapPage* page = exec_pages_; page != NULL; page = page->next()) { |
(...skipping 22 matching lines...) Expand all Loading... |
706 page_space_controller_.set_last_code_collection_in_us(start); | 706 page_space_controller_.set_last_code_collection_in_us(start); |
707 return true; | 707 return true; |
708 } | 708 } |
709 return false; | 709 return false; |
710 } | 710 } |
711 | 711 |
712 | 712 |
713 void PageSpace::WriteProtectCode(bool read_only) { | 713 void PageSpace::WriteProtectCode(bool read_only) { |
714 if (FLAG_write_protect_code) { | 714 if (FLAG_write_protect_code) { |
715 MutexLocker ml(pages_lock_); | 715 MutexLocker ml(pages_lock_); |
716 NoGCScope no_gc; | 716 NoSafepointScope no_safepoint; |
717 // No need to go through all of the data pages first. | 717 // No need to go through all of the data pages first. |
718 HeapPage* page = exec_pages_; | 718 HeapPage* page = exec_pages_; |
719 while (page != NULL) { | 719 while (page != NULL) { |
720 ASSERT(page->type() == HeapPage::kExecutable); | 720 ASSERT(page->type() == HeapPage::kExecutable); |
721 page->WriteProtect(read_only); | 721 page->WriteProtect(read_only); |
722 page = page->next(); | 722 page = page->next(); |
723 } | 723 } |
724 page = large_pages_; | 724 page = large_pages_; |
725 while (page != NULL) { | 725 while (page != NULL) { |
726 if (page->type() == HeapPage::kExecutable) { | 726 if (page->type() == HeapPage::kExecutable) { |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1117 return 0; | 1117 return 0; |
1118 } else { | 1118 } else { |
1119 ASSERT(total_time >= gc_time); | 1119 ASSERT(total_time >= gc_time); |
1120 int result = static_cast<int>((static_cast<double>(gc_time) / | 1120 int result = static_cast<int>((static_cast<double>(gc_time) / |
1121 static_cast<double>(total_time)) * 100); | 1121 static_cast<double>(total_time)) * 100); |
1122 return result; | 1122 return result; |
1123 } | 1123 } |
1124 } | 1124 } |
1125 | 1125 |
1126 } // namespace dart | 1126 } // namespace dart |
OLD | NEW |