| 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/heap.h" | 5 #include "vm/heap.h" | 
| 6 | 6 | 
| 7 #include "platform/assert.h" | 7 #include "platform/assert.h" | 
| 8 #include "platform/utils.h" | 8 #include "platform/utils.h" | 
| 9 #include "vm/flags.h" | 9 #include "vm/flags.h" | 
| 10 #include "vm/isolate.h" | 10 #include "vm/isolate.h" | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 69   for (int sel = 0; | 69   for (int sel = 0; | 
| 70        sel < kNumWeakSelectors; | 70        sel < kNumWeakSelectors; | 
| 71        sel++) { | 71        sel++) { | 
| 72     delete new_weak_tables_[sel]; | 72     delete new_weak_tables_[sel]; | 
| 73     delete old_weak_tables_[sel]; | 73     delete old_weak_tables_[sel]; | 
| 74   } | 74   } | 
| 75 } | 75 } | 
| 76 | 76 | 
| 77 | 77 | 
| 78 uword Heap::AllocateNew(intptr_t size) { | 78 uword Heap::AllocateNew(intptr_t size) { | 
| 79   ASSERT(isolate()->no_gc_scope_depth() == 0); | 79   ASSERT(isolate()->no_safepoint_scope_depth() == 0); | 
| 80   uword addr = new_space_->TryAllocate(size); | 80   uword addr = new_space_->TryAllocate(size); | 
| 81   if (addr == 0) { | 81   if (addr == 0) { | 
| 82     CollectGarbage(kNew); | 82     CollectGarbage(kNew); | 
| 83     addr = new_space_->TryAllocate(size); | 83     addr = new_space_->TryAllocate(size); | 
| 84     if (addr == 0) { | 84     if (addr == 0) { | 
| 85       return AllocateOld(size, HeapPage::kData); | 85       return AllocateOld(size, HeapPage::kData); | 
| 86     } | 86     } | 
| 87   } | 87   } | 
| 88   return addr; | 88   return addr; | 
| 89 } | 89 } | 
| 90 | 90 | 
| 91 | 91 | 
| 92 uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) { | 92 uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) { | 
| 93   ASSERT(isolate()->no_gc_scope_depth() == 0); | 93   ASSERT(isolate()->no_safepoint_scope_depth() == 0); | 
| 94   uword addr = old_space_->TryAllocate(size, type); | 94   uword addr = old_space_->TryAllocate(size, type); | 
| 95   if (addr != 0) { | 95   if (addr != 0) { | 
| 96     return addr; | 96     return addr; | 
| 97   } | 97   } | 
| 98   // If we are in the process of running a sweep wait for the sweeper to free | 98   // If we are in the process of running a sweep wait for the sweeper to free | 
| 99   // memory. | 99   // memory. | 
| 100   { | 100   { | 
| 101     MonitorLocker ml(old_space_->tasks_lock()); | 101     MonitorLocker ml(old_space_->tasks_lock()); | 
| 102     addr = old_space_->TryAllocate(size, type); | 102     addr = old_space_->TryAllocate(size, type); | 
| 103     while ((addr == 0) && (old_space_->tasks() > 0)) { | 103     while ((addr == 0) && (old_space_->tasks() > 0)) { | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 144     return addr; | 144     return addr; | 
| 145   } | 145   } | 
| 146   // Give up allocating this object. | 146   // Give up allocating this object. | 
| 147   OS::PrintErr( | 147   OS::PrintErr( | 
| 148       "Exhausted heap space, trying to allocate %" Pd " bytes.\n", size); | 148       "Exhausted heap space, trying to allocate %" Pd " bytes.\n", size); | 
| 149   return 0; | 149   return 0; | 
| 150 } | 150 } | 
| 151 | 151 | 
| 152 | 152 | 
| 153 uword Heap::AllocatePretenured(intptr_t size) { | 153 uword Heap::AllocatePretenured(intptr_t size) { | 
| 154   ASSERT(isolate()->no_gc_scope_depth() == 0); | 154   ASSERT(isolate()->no_safepoint_scope_depth() == 0); | 
| 155   uword addr = old_space_->TryAllocateDataBump(size, PageSpace::kControlGrowth); | 155   uword addr = old_space_->TryAllocateDataBump(size, PageSpace::kControlGrowth); | 
| 156   if (addr != 0) return addr; | 156   if (addr != 0) return addr; | 
| 157   return AllocateOld(size, HeapPage::kData); | 157   return AllocateOld(size, HeapPage::kData); | 
| 158 } | 158 } | 
| 159 | 159 | 
| 160 | 160 | 
| 161 void Heap::AllocateExternal(intptr_t size, Space space) { | 161 void Heap::AllocateExternal(intptr_t size, Space space) { | 
| 162   ASSERT(isolate()->no_gc_scope_depth() == 0); | 162   ASSERT(isolate()->no_safepoint_scope_depth() == 0); | 
| 163   if (space == kNew) { | 163   if (space == kNew) { | 
| 164     new_space_->AllocateExternal(size); | 164     new_space_->AllocateExternal(size); | 
| 165     if (new_space_->ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) { | 165     if (new_space_->ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) { | 
| 166       // Attempt to free some external allocation by a scavenge. (If the total | 166       // Attempt to free some external allocation by a scavenge. (If the total | 
| 167       // remains above the limit, next external alloc will trigger another.) | 167       // remains above the limit, next external alloc will trigger another.) | 
| 168       CollectGarbage(kNew); | 168       CollectGarbage(kNew); | 
| 169     } | 169     } | 
| 170   } else { | 170   } else { | 
| 171     ASSERT(space == kOld); | 171     ASSERT(space == kOld); | 
| 172     old_space_->AllocateExternal(size); | 172     old_space_->AllocateExternal(size); | 
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 261   return old_space_->FindObject(visitor, HeapPage::kData); | 261   return old_space_->FindObject(visitor, HeapPage::kData); | 
| 262 } | 262 } | 
| 263 | 263 | 
| 264 | 264 | 
| 265 RawObject* Heap::FindNewObject(FindObjectVisitor* visitor) const { | 265 RawObject* Heap::FindNewObject(FindObjectVisitor* visitor) const { | 
| 266   return new_space_->FindObject(visitor); | 266   return new_space_->FindObject(visitor); | 
| 267 } | 267 } | 
| 268 | 268 | 
| 269 | 269 | 
| 270 RawObject* Heap::FindObject(FindObjectVisitor* visitor) const { | 270 RawObject* Heap::FindObject(FindObjectVisitor* visitor) const { | 
| 271   ASSERT(isolate()->no_gc_scope_depth() != 0); | 271   ASSERT(isolate()->no_safepoint_scope_depth() != 0); | 
| 272   RawObject* raw_obj = FindNewObject(visitor); | 272   RawObject* raw_obj = FindNewObject(visitor); | 
| 273   if (raw_obj != Object::null()) { | 273   if (raw_obj != Object::null()) { | 
| 274     return raw_obj; | 274     return raw_obj; | 
| 275   } | 275   } | 
| 276   raw_obj = FindOldObject(visitor); | 276   raw_obj = FindOldObject(visitor); | 
| 277   if (raw_obj != Object::null()) { | 277   if (raw_obj != Object::null()) { | 
| 278     return raw_obj; | 278     return raw_obj; | 
| 279   } | 279   } | 
| 280   raw_obj = FindObjectInCodeSpace(visitor); | 280   raw_obj = FindObjectInCodeSpace(visitor); | 
| 281   return raw_obj; | 281   return raw_obj; | 
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 709     jsobj.AddProperty("eventType", "GC");  // TODO(koda): "GarbageCollected" | 709     jsobj.AddProperty("eventType", "GC");  // TODO(koda): "GarbageCollected" | 
| 710     jsobj.AddProperty("isolate", isolate); | 710     jsobj.AddProperty("isolate", isolate); | 
| 711     jsobj.AddProperty("reason", Heap::GCReasonToString(stats_.reason_)); | 711     jsobj.AddProperty("reason", Heap::GCReasonToString(stats_.reason_)); | 
| 712     isolate->heap()->PrintToJSONObject(Heap::kNew, &jsobj); | 712     isolate->heap()->PrintToJSONObject(Heap::kNew, &jsobj); | 
| 713     isolate->heap()->PrintToJSONObject(Heap::kOld, &jsobj); | 713     isolate->heap()->PrintToJSONObject(Heap::kOld, &jsobj); | 
| 714   } | 714   } | 
| 715 } | 715 } | 
| 716 | 716 | 
| 717 | 717 | 
| 718 #if defined(DEBUG) | 718 #if defined(DEBUG) | 
| 719 NoGCScope::NoGCScope() : StackResource(Isolate::Current()) { | 719 NoSafepointScope::NoSafepointScope() : StackResource(Isolate::Current()) { | 
| 720   isolate()->IncrementNoGCScopeDepth(); | 720   isolate()->IncrementNoSafepointScopeDepth(); | 
| 721 } | 721 } | 
| 722 | 722 | 
| 723 | 723 | 
| 724 NoGCScope::~NoGCScope() { | 724 NoSafepointScope::~NoSafepointScope() { | 
| 725   isolate()->DecrementNoGCScopeDepth(); | 725   isolate()->DecrementNoSafepointScopeDepth(); | 
| 726 } | 726 } | 
| 727 #endif  // defined(DEBUG) | 727 #endif  // defined(DEBUG) | 
| 728 | 728 | 
| 729 | 729 | 
| 730 NoHeapGrowthControlScope::NoHeapGrowthControlScope() | 730 NoHeapGrowthControlScope::NoHeapGrowthControlScope() | 
| 731     : StackResource(Isolate::Current()) { | 731     : StackResource(Isolate::Current()) { | 
| 732     Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); | 732     Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); | 
| 733     current_growth_controller_state_ = heap->GrowthControlState(); | 733     current_growth_controller_state_ = heap->GrowthControlState(); | 
| 734     heap->DisableGrowthControl(); | 734     heap->DisableGrowthControl(); | 
| 735 } | 735 } | 
| 736 | 736 | 
| 737 | 737 | 
| 738 NoHeapGrowthControlScope::~NoHeapGrowthControlScope() { | 738 NoHeapGrowthControlScope::~NoHeapGrowthControlScope() { | 
| 739     Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); | 739     Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); | 
| 740     heap->SetGrowthControlState(current_growth_controller_state_); | 740     heap->SetGrowthControlState(current_growth_controller_state_); | 
| 741 } | 741 } | 
| 742 | 742 | 
| 743 }  // namespace dart | 743 }  // namespace dart | 
| OLD | NEW | 
|---|