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 |