| Index: runtime/vm/pages.cc
|
| diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
|
| index 344ec189fda260cf983116c78fe00604c7a3f5ad..afda7bb609034de169be4c345c4cee8e6d894b72 100644
|
| --- a/runtime/vm/pages.cc
|
| +++ b/runtime/vm/pages.cc
|
| @@ -78,7 +78,6 @@ HeapPage* HeapPage::Initialize(VirtualMemory* memory,
|
| return result;
|
| }
|
|
|
| -
|
| HeapPage* HeapPage::Allocate(intptr_t size_in_words,
|
| PageType type,
|
| const char* name) {
|
| @@ -95,7 +94,6 @@ HeapPage* HeapPage::Allocate(intptr_t size_in_words,
|
| return result;
|
| }
|
|
|
| -
|
| void HeapPage::Deallocate() {
|
| bool image_page = is_image_page();
|
|
|
| @@ -114,7 +112,6 @@ void HeapPage::Deallocate() {
|
| }
|
| }
|
|
|
| -
|
| void HeapPage::VisitObjects(ObjectVisitor* visitor) const {
|
| NoSafepointScope no_safepoint;
|
| uword obj_addr = object_start();
|
| @@ -127,7 +124,6 @@ void HeapPage::VisitObjects(ObjectVisitor* visitor) const {
|
| ASSERT(obj_addr == end_addr);
|
| }
|
|
|
| -
|
| void HeapPage::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
|
| NoSafepointScope no_safepoint;
|
| uword obj_addr = object_start();
|
| @@ -139,7 +135,6 @@ void HeapPage::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
|
| ASSERT(obj_addr == end_addr);
|
| }
|
|
|
| -
|
| RawObject* HeapPage::FindObject(FindObjectVisitor* visitor) const {
|
| uword obj_addr = object_start();
|
| uword end_addr = object_end();
|
| @@ -158,7 +153,6 @@ RawObject* HeapPage::FindObject(FindObjectVisitor* visitor) const {
|
| return Object::null();
|
| }
|
|
|
| -
|
| void HeapPage::WriteProtect(bool read_only) {
|
| ASSERT(!is_image_page());
|
|
|
| @@ -176,7 +170,6 @@ void HeapPage::WriteProtect(bool read_only) {
|
| ASSERT(status);
|
| }
|
|
|
| -
|
| PageSpace::PageSpace(Heap* heap,
|
| intptr_t max_capacity_in_words,
|
| intptr_t max_external_in_words)
|
| @@ -208,7 +201,6 @@ PageSpace::PageSpace(Heap* heap,
|
| UpdateMaxUsed();
|
| }
|
|
|
| -
|
| PageSpace::~PageSpace() {
|
| {
|
| MonitorLocker ml(tasks_lock());
|
| @@ -223,14 +215,12 @@ PageSpace::~PageSpace() {
|
| delete tasks_lock_;
|
| }
|
|
|
| -
|
| intptr_t PageSpace::LargePageSizeInWordsFor(intptr_t size) {
|
| intptr_t page_size = Utils::RoundUp(size + HeapPage::ObjectStartOffset(),
|
| VirtualMemory::PageSize());
|
| return page_size >> kWordSizeLog2;
|
| }
|
|
|
| -
|
| HeapPage* PageSpace::AllocatePage(HeapPage::PageType type) {
|
| const bool is_exec = (type == HeapPage::kExecutable);
|
| const intptr_t kVmNameSize = 128;
|
| @@ -273,7 +263,6 @@ HeapPage* PageSpace::AllocatePage(HeapPage::PageType type) {
|
| return page;
|
| }
|
|
|
| -
|
| HeapPage* PageSpace::AllocateLargePage(intptr_t size, HeapPage::PageType type) {
|
| const bool is_exec = (type == HeapPage::kExecutable);
|
| const intptr_t page_size_in_words = LargePageSizeInWordsFor(size);
|
| @@ -294,7 +283,6 @@ HeapPage* PageSpace::AllocateLargePage(intptr_t size, HeapPage::PageType type) {
|
| return page;
|
| }
|
|
|
| -
|
| void PageSpace::TruncateLargePage(HeapPage* page,
|
| intptr_t new_object_size_in_bytes) {
|
| const intptr_t old_object_size_in_bytes =
|
| @@ -311,7 +299,6 @@ void PageSpace::TruncateLargePage(HeapPage* page,
|
| }
|
| }
|
|
|
| -
|
| void PageSpace::FreePage(HeapPage* page, HeapPage* previous_page) {
|
| bool is_exec = (page->type() == HeapPage::kExecutable);
|
| {
|
| @@ -343,7 +330,6 @@ void PageSpace::FreePage(HeapPage* page, HeapPage* previous_page) {
|
| page->Deallocate();
|
| }
|
|
|
| -
|
| void PageSpace::FreeLargePage(HeapPage* page, HeapPage* previous_page) {
|
| IncreaseCapacityInWords(-(page->memory_->size() >> kWordSizeLog2));
|
| // Remove the page from the list.
|
| @@ -355,7 +341,6 @@ void PageSpace::FreeLargePage(HeapPage* page, HeapPage* previous_page) {
|
| page->Deallocate();
|
| }
|
|
|
| -
|
| void PageSpace::FreePages(HeapPage* pages) {
|
| HeapPage* page = pages;
|
| while (page != NULL) {
|
| @@ -365,7 +350,6 @@ void PageSpace::FreePages(HeapPage* pages) {
|
| }
|
| }
|
|
|
| -
|
| uword PageSpace::TryAllocateInFreshPage(intptr_t size,
|
| HeapPage::PageType type,
|
| GrowthPolicy growth_policy,
|
| @@ -402,7 +386,6 @@ uword PageSpace::TryAllocateInFreshPage(intptr_t size,
|
| return result;
|
| }
|
|
|
| -
|
| uword PageSpace::TryAllocateInternal(intptr_t size,
|
| HeapPage::PageType type,
|
| GrowthPolicy growth_policy,
|
| @@ -450,30 +433,25 @@ uword PageSpace::TryAllocateInternal(intptr_t size,
|
| return result;
|
| }
|
|
|
| -
|
| void PageSpace::AcquireDataLock() {
|
| freelist_[HeapPage::kData].mutex()->Lock();
|
| }
|
|
|
| -
|
| void PageSpace::ReleaseDataLock() {
|
| freelist_[HeapPage::kData].mutex()->Unlock();
|
| }
|
|
|
| -
|
| void PageSpace::AllocateExternal(intptr_t size) {
|
| intptr_t size_in_words = size >> kWordSizeLog2;
|
| AtomicOperations::IncrementBy(&(usage_.external_in_words), size_in_words);
|
| // TODO(koda): Control growth.
|
| }
|
|
|
| -
|
| void PageSpace::FreeExternal(intptr_t size) {
|
| intptr_t size_in_words = size >> kWordSizeLog2;
|
| AtomicOperations::DecrementBy(&(usage_.external_in_words), size_in_words);
|
| }
|
|
|
| -
|
| // Provides exclusive access to all pages, and ensures they are walkable.
|
| class ExclusivePageIterator : ValueObject {
|
| public:
|
| @@ -502,7 +480,6 @@ class ExclusivePageIterator : ValueObject {
|
| HeapPage* page_;
|
| };
|
|
|
| -
|
| // Provides exclusive access to code pages, and ensures they are walkable.
|
| // NOTE: This does not iterate over large pages which can contain code.
|
| class ExclusiveCodePageIterator : ValueObject {
|
| @@ -526,7 +503,6 @@ class ExclusiveCodePageIterator : ValueObject {
|
| HeapPage* page_;
|
| };
|
|
|
| -
|
| // Provides exclusive access to large pages, and ensures they are walkable.
|
| class ExclusiveLargePageIterator : ValueObject {
|
| public:
|
| @@ -549,7 +525,6 @@ class ExclusiveLargePageIterator : ValueObject {
|
| HeapPage* page_;
|
| };
|
|
|
| -
|
| void PageSpace::MakeIterable() const {
|
| // Assert not called from concurrent sweeper task.
|
| // TODO(koda): Use thread/task identity when implemented.
|
| @@ -559,7 +534,6 @@ void PageSpace::MakeIterable() const {
|
| }
|
| }
|
|
|
| -
|
| void PageSpace::AbandonBumpAllocation() {
|
| if (bump_top_ < bump_end_) {
|
| freelist_[HeapPage::kData].Free(bump_top_, bump_end_ - bump_top_);
|
| @@ -568,7 +542,6 @@ void PageSpace::AbandonBumpAllocation() {
|
| }
|
| }
|
|
|
| -
|
| void PageSpace::UpdateMaxCapacityLocked() {
|
| if (heap_ == NULL) {
|
| // Some unit tests.
|
| @@ -581,7 +554,6 @@ void PageSpace::UpdateMaxCapacityLocked() {
|
| static_cast<int64_t>(usage_.capacity_in_words) * kWordSize);
|
| }
|
|
|
| -
|
| void PageSpace::UpdateMaxUsed() {
|
| if (heap_ == NULL) {
|
| // Some unit tests.
|
| @@ -593,7 +565,6 @@ void PageSpace::UpdateMaxUsed() {
|
| isolate->GetHeapOldUsedMaxMetric()->SetValue(UsedInWords() * kWordSize);
|
| }
|
|
|
| -
|
| bool PageSpace::Contains(uword addr) const {
|
| for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
|
| if (it.page()->Contains(addr)) {
|
| @@ -603,7 +574,6 @@ bool PageSpace::Contains(uword addr) const {
|
| return false;
|
| }
|
|
|
| -
|
| bool PageSpace::Contains(uword addr, HeapPage::PageType type) const {
|
| if (type == HeapPage::kExecutable) {
|
| // Fast path executable pages.
|
| @@ -628,7 +598,6 @@ bool PageSpace::Contains(uword addr, HeapPage::PageType type) const {
|
| return false;
|
| }
|
|
|
| -
|
| bool PageSpace::DataContains(uword addr) const {
|
| for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
|
| if ((it.page()->type() != HeapPage::kExecutable) &&
|
| @@ -639,7 +608,6 @@ bool PageSpace::DataContains(uword addr) const {
|
| return false;
|
| }
|
|
|
| -
|
| void PageSpace::AddRegionsToObjectSet(ObjectSet* set) const {
|
| ASSERT((pages_ != NULL) || (exec_pages_ != NULL) || (large_pages_ != NULL));
|
| for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
|
| @@ -647,14 +615,12 @@ void PageSpace::AddRegionsToObjectSet(ObjectSet* set) const {
|
| }
|
| }
|
|
|
| -
|
| void PageSpace::VisitObjects(ObjectVisitor* visitor) const {
|
| for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
|
| it.page()->VisitObjects(visitor);
|
| }
|
| }
|
|
|
| -
|
| void PageSpace::VisitObjectsNoImagePages(ObjectVisitor* visitor) const {
|
| for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
|
| if (!it.page()->is_image_page()) {
|
| @@ -663,7 +629,6 @@ void PageSpace::VisitObjectsNoImagePages(ObjectVisitor* visitor) const {
|
| }
|
| }
|
|
|
| -
|
| void PageSpace::VisitObjectsImagePages(ObjectVisitor* visitor) const {
|
| for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
|
| if (it.page()->is_image_page()) {
|
| @@ -672,14 +637,12 @@ void PageSpace::VisitObjectsImagePages(ObjectVisitor* visitor) const {
|
| }
|
| }
|
|
|
| -
|
| void PageSpace::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
|
| for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
|
| it.page()->VisitObjectPointers(visitor);
|
| }
|
| }
|
|
|
| -
|
| RawObject* PageSpace::FindObject(FindObjectVisitor* visitor,
|
| HeapPage::PageType type) const {
|
| if (type == HeapPage::kExecutable) {
|
| @@ -713,7 +676,6 @@ RawObject* PageSpace::FindObject(FindObjectVisitor* visitor,
|
| return Object::null();
|
| }
|
|
|
| -
|
| void PageSpace::WriteProtect(bool read_only) {
|
| if (read_only) {
|
| // Avoid MakeIterable trying to write to the heap.
|
| @@ -726,7 +688,6 @@ void PageSpace::WriteProtect(bool read_only) {
|
| }
|
| }
|
|
|
| -
|
| #ifndef PRODUCT
|
| void PageSpace::PrintToJSONObject(JSONObject* object) const {
|
| if (!FLAG_support_service) {
|
| @@ -756,7 +717,6 @@ void PageSpace::PrintToJSONObject(JSONObject* object) const {
|
| }
|
| }
|
|
|
| -
|
| class HeapMapAsJSONVisitor : public ObjectVisitor {
|
| public:
|
| explicit HeapMapAsJSONVisitor(JSONArray* array) : array_(array) {}
|
| @@ -769,7 +729,6 @@ class HeapMapAsJSONVisitor : public ObjectVisitor {
|
| JSONArray* array_;
|
| };
|
|
|
| -
|
| void PageSpace::PrintHeapMapToJSONStream(Isolate* isolate,
|
| JSONStream* stream) const {
|
| if (!FLAG_support_service) {
|
| @@ -813,7 +772,6 @@ void PageSpace::PrintHeapMapToJSONStream(Isolate* isolate,
|
| }
|
| #endif // PRODUCT
|
|
|
| -
|
| bool PageSpace::ShouldCollectCode() {
|
| // Try to collect code if enough time has passed since the last attempt.
|
| const int64_t start = OS::GetCurrentMonotonicMicros();
|
| @@ -831,7 +789,6 @@ bool PageSpace::ShouldCollectCode() {
|
| return false;
|
| }
|
|
|
| -
|
| void PageSpace::WriteProtectCode(bool read_only) {
|
| if (FLAG_write_protect_code) {
|
| MutexLocker ml(pages_lock_);
|
| @@ -855,7 +812,6 @@ void PageSpace::WriteProtectCode(bool read_only) {
|
| }
|
| }
|
|
|
| -
|
| void PageSpace::MarkSweep(bool invoke_api_callbacks) {
|
| Thread* thread = Thread::Current();
|
| Isolate* isolate = heap_->isolate();
|
| @@ -1036,7 +992,6 @@ void PageSpace::MarkSweep(bool invoke_api_callbacks) {
|
| }
|
| }
|
|
|
| -
|
| uword PageSpace::TryAllocateDataBumpInternal(intptr_t size,
|
| GrowthPolicy growth_policy,
|
| bool is_locked) {
|
| @@ -1088,19 +1043,16 @@ uword PageSpace::TryAllocateDataBumpInternal(intptr_t size,
|
| return result;
|
| }
|
|
|
| -
|
| uword PageSpace::TryAllocateDataBump(intptr_t size,
|
| GrowthPolicy growth_policy) {
|
| return TryAllocateDataBumpInternal(size, growth_policy, false);
|
| }
|
|
|
| -
|
| uword PageSpace::TryAllocateDataBumpLocked(intptr_t size,
|
| GrowthPolicy growth_policy) {
|
| return TryAllocateDataBumpInternal(size, growth_policy, true);
|
| }
|
|
|
| -
|
| uword PageSpace::TryAllocatePromoLocked(intptr_t size,
|
| GrowthPolicy growth_policy) {
|
| FreeList* freelist = &freelist_[HeapPage::kData];
|
| @@ -1115,7 +1067,6 @@ uword PageSpace::TryAllocatePromoLocked(intptr_t size,
|
| return TryAllocateDataLocked(size, growth_policy);
|
| }
|
|
|
| -
|
| void PageSpace::SetupImagePage(void* pointer, uword size, bool is_executable) {
|
| // Setup a HeapPage so precompiled Instructions can be traversed.
|
| // Instructions are contiguous at [pointer, pointer + size). HeapPage
|
| @@ -1158,7 +1109,6 @@ void PageSpace::SetupImagePage(void* pointer, uword size, bool is_executable) {
|
| (*tail) = page;
|
| }
|
|
|
| -
|
| PageSpaceController::PageSpaceController(Heap* heap,
|
| int heap_growth_ratio,
|
| int heap_growth_max,
|
| @@ -1172,10 +1122,8 @@ PageSpaceController::PageSpaceController(Heap* heap,
|
| garbage_collection_time_ratio_(garbage_collection_time_ratio),
|
| last_code_collection_in_us_(OS::GetCurrentMonotonicMicros()) {}
|
|
|
| -
|
| PageSpaceController::~PageSpaceController() {}
|
|
|
| -
|
| bool PageSpaceController::NeedsGarbageCollection(SpaceUsage after) const {
|
| if (!is_enabled_) {
|
| return false;
|
| @@ -1212,7 +1160,6 @@ bool PageSpaceController::NeedsGarbageCollection(SpaceUsage after) const {
|
| return needs_gc;
|
| }
|
|
|
| -
|
| void PageSpaceController::EvaluateGarbageCollection(SpaceUsage before,
|
| SpaceUsage after,
|
| int64_t start,
|
| @@ -1296,7 +1243,6 @@ void PageSpaceController::EvaluateGarbageCollection(SpaceUsage before,
|
| last_usage_ = after;
|
| }
|
|
|
| -
|
| void PageSpaceGarbageCollectionHistory::AddGarbageCollectionTime(int64_t start,
|
| int64_t end) {
|
| Entry entry;
|
| @@ -1305,7 +1251,6 @@ void PageSpaceGarbageCollectionHistory::AddGarbageCollectionTime(int64_t start,
|
| history_.Add(entry);
|
| }
|
|
|
| -
|
| int PageSpaceGarbageCollectionHistory::GarbageCollectionTimeFraction() {
|
| int64_t gc_time = 0;
|
| int64_t total_time = 0;
|
|
|