Chromium Code Reviews| 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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 page->set_next(large_pages_); | 175 page->set_next(large_pages_); |
| 176 large_pages_ = page; | 176 large_pages_ = page; |
| 177 usage_.capacity_in_words += page_size_in_words; | 177 usage_.capacity_in_words += page_size_in_words; |
| 178 // Only one object in this page (at least until String::MakeExternal or | 178 // Only one object in this page (at least until String::MakeExternal or |
| 179 // Array::MakeArray is called). | 179 // Array::MakeArray is called). |
| 180 page->set_object_end(page->object_start() + size); | 180 page->set_object_end(page->object_start() + size); |
| 181 return page; | 181 return page; |
| 182 } | 182 } |
| 183 | 183 |
| 184 | 184 |
| 185 void PageSpace::TruncateLargePage(HeapPage* page, | |
| 186 intptr_t new_object_size_in_bytes) { | |
| 187 const intptr_t old_object_size_in_bytes = | |
| 188 page->object_end() - page->object_start(); | |
| 189 ASSERT(new_object_size_in_bytes < old_object_size_in_bytes); | |
| 190 const intptr_t new_page_size_in_words = | |
| 191 LargePageSizeInWordsFor(new_object_size_in_bytes); | |
| 192 VirtualMemory* memory = page->memory_; | |
| 193 const intptr_t old_page_size_in_words = (memory->size() >> kWordSizeLog2); | |
| 194 memory->Truncate(memory->start(), (new_page_size_in_words << kWordSizeLog2)); | |
| 195 usage_.capacity_in_words -= old_page_size_in_words; | |
| 196 usage_.capacity_in_words += new_page_size_in_words; | |
| 197 page->set_object_end(page->object_start() + new_object_size_in_bytes); | |
| 198 } | |
| 199 | |
| 200 | |
| 185 void PageSpace::FreePage(HeapPage* page, HeapPage* previous_page) { | 201 void PageSpace::FreePage(HeapPage* page, HeapPage* previous_page) { |
| 186 usage_.capacity_in_words -= (page->memory_->size() >> kWordSizeLog2); | 202 usage_.capacity_in_words -= (page->memory_->size() >> kWordSizeLog2); |
| 187 // Remove the page from the list. | 203 // Remove the page from the list. |
| 188 if (previous_page != NULL) { | 204 if (previous_page != NULL) { |
| 189 previous_page->set_next(page->next()); | 205 previous_page->set_next(page->next()); |
| 190 } else { | 206 } else { |
| 191 pages_ = page->next(); | 207 pages_ = page->next(); |
| 192 } | 208 } |
| 193 if (page == pages_tail_) { | 209 if (page == pages_tail_) { |
| 194 pages_tail_ = previous_page; | 210 pages_tail_ = previous_page; |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 531 // Advance to the next page. | 547 // Advance to the next page. |
| 532 page = next_page; | 548 page = next_page; |
| 533 } | 549 } |
| 534 | 550 |
| 535 int64_t mid3 = OS::GetCurrentTimeMicros(); | 551 int64_t mid3 = OS::GetCurrentTimeMicros(); |
| 536 | 552 |
| 537 prev_page = NULL; | 553 prev_page = NULL; |
| 538 page = large_pages_; | 554 page = large_pages_; |
| 539 while (page != NULL) { | 555 while (page != NULL) { |
| 540 HeapPage* next_page = page->next(); | 556 HeapPage* next_page = page->next(); |
| 541 bool page_in_use = sweeper.SweepLargePage(page); | 557 const intptr_t bytes_to_end = sweeper.SweepLargePage(page); |
| 542 if (page_in_use) { | 558 if (bytes_to_end == 0) { |
| 559 FreeLargePage(page, prev_page); | |
| 560 } else { | |
| 561 if (bytes_to_end < (page->object_end() - page->object_start())) { | |
|
Ivan Posva
2014/06/30 05:51:05
I am wondering whether we want to move the logic h
koda
2014/06/30 22:57:49
Done.
| |
| 562 TruncateLargePage(page, bytes_to_end); | |
| 563 } | |
| 543 prev_page = page; | 564 prev_page = page; |
| 544 } else { | |
| 545 FreeLargePage(page, prev_page); | |
| 546 } | 565 } |
| 547 // Advance to the next page. | 566 // Advance to the next page. |
| 548 page = next_page; | 567 page = next_page; |
| 549 } | 568 } |
| 550 | 569 |
| 551 // Make code pages read-only. | 570 // Make code pages read-only. |
| 552 WriteProtectCode(true); | 571 WriteProtectCode(true); |
| 553 | 572 |
| 554 int64_t end = OS::GetCurrentTimeMicros(); | 573 int64_t end = OS::GetCurrentTimeMicros(); |
| 555 | 574 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 695 return 0; | 714 return 0; |
| 696 } else { | 715 } else { |
| 697 ASSERT(total_time >= gc_time); | 716 ASSERT(total_time >= gc_time); |
| 698 int result= static_cast<int>((static_cast<double>(gc_time) / | 717 int result= static_cast<int>((static_cast<double>(gc_time) / |
| 699 static_cast<double>(total_time)) * 100); | 718 static_cast<double>(total_time)) * 100); |
| 700 return result; | 719 return result; |
| 701 } | 720 } |
| 702 } | 721 } |
| 703 | 722 |
| 704 } // namespace dart | 723 } // namespace dart |
| OLD | NEW |