Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(286)

Side by Side Diff: runtime/vm/heap.cc

Issue 1250463004: Migrate NoSafepointScope; add constrained concurrent allocation to unit test (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Assert current thread is mutator; add shared assertion macro. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/heap_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 for (int sel = 0; 67 for (int sel = 0;
68 sel < kNumWeakSelectors; 68 sel < kNumWeakSelectors;
69 sel++) { 69 sel++) {
70 delete new_weak_tables_[sel]; 70 delete new_weak_tables_[sel];
71 delete old_weak_tables_[sel]; 71 delete old_weak_tables_[sel];
72 } 72 }
73 } 73 }
74 74
75 75
76 uword Heap::AllocateNew(intptr_t size) { 76 uword Heap::AllocateNew(intptr_t size) {
77 ASSERT(isolate()->no_safepoint_scope_depth() == 0); 77 ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
78 // Currently, only the Dart thread may allocate in new space.
79 isolate()->AssertCurrentThreadIsMutator();
78 uword addr = new_space_.TryAllocate(size); 80 uword addr = new_space_.TryAllocate(size);
79 if (addr == 0) { 81 if (addr == 0) {
80 CollectGarbage(kNew); 82 CollectGarbage(kNew);
81 addr = new_space_.TryAllocate(size); 83 addr = new_space_.TryAllocate(size);
82 if (addr == 0) { 84 if (addr == 0) {
83 return AllocateOld(size, HeapPage::kData); 85 return AllocateOld(size, HeapPage::kData);
84 } 86 }
85 } 87 }
86 return addr; 88 return addr;
87 } 89 }
88 90
89 91
90 uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) { 92 uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) {
91 ASSERT(isolate()->no_safepoint_scope_depth() == 0); 93 ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
94 #if defined(DEBUG)
95 // Currently, allocation from non-Dart threads must not trigger GC.
96 if (GrowthControlState()) {
97 isolate()->AssertCurrentThreadIsMutator();
98 }
99 #endif
92 uword addr = old_space_.TryAllocate(size, type); 100 uword addr = old_space_.TryAllocate(size, type);
93 if (addr != 0) { 101 if (addr != 0) {
94 return addr; 102 return addr;
95 } 103 }
96 // If we are in the process of running a sweep wait for the sweeper to free 104 // If we are in the process of running a sweep wait for the sweeper to free
97 // memory. 105 // memory.
98 { 106 {
99 MonitorLocker ml(old_space_.tasks_lock()); 107 MonitorLocker ml(old_space_.tasks_lock());
100 addr = old_space_.TryAllocate(size, type); 108 addr = old_space_.TryAllocate(size, type);
101 while ((addr == 0) && (old_space_.tasks() > 0)) { 109 while ((addr == 0) && (old_space_.tasks() > 0)) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 return addr; 150 return addr;
143 } 151 }
144 // Give up allocating this object. 152 // Give up allocating this object.
145 OS::PrintErr( 153 OS::PrintErr(
146 "Exhausted heap space, trying to allocate %" Pd " bytes.\n", size); 154 "Exhausted heap space, trying to allocate %" Pd " bytes.\n", size);
147 return 0; 155 return 0;
148 } 156 }
149 157
150 158
151 uword Heap::AllocatePretenured(intptr_t size) { 159 uword Heap::AllocatePretenured(intptr_t size) {
152 ASSERT(isolate()->no_safepoint_scope_depth() == 0); 160 ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
153 uword addr = old_space_.TryAllocateDataBump(size, PageSpace::kControlGrowth); 161 uword addr = old_space_.TryAllocateDataBump(size, PageSpace::kControlGrowth);
154 if (addr != 0) return addr; 162 if (addr != 0) return addr;
155 return AllocateOld(size, HeapPage::kData); 163 return AllocateOld(size, HeapPage::kData);
156 } 164 }
157 165
158 166
159 void Heap::AllocateExternal(intptr_t size, Space space) { 167 void Heap::AllocateExternal(intptr_t size, Space space) {
160 ASSERT(isolate()->no_safepoint_scope_depth() == 0); 168 ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
161 if (space == kNew) { 169 if (space == kNew) {
162 new_space_.AllocateExternal(size); 170 new_space_.AllocateExternal(size);
163 if (new_space_.ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) { 171 if (new_space_.ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) {
164 // Attempt to free some external allocation by a scavenge. (If the total 172 // Attempt to free some external allocation by a scavenge. (If the total
165 // remains above the limit, next external alloc will trigger another.) 173 // remains above the limit, next external alloc will trigger another.)
166 CollectGarbage(kNew); 174 CollectGarbage(kNew);
167 } 175 }
168 } else { 176 } else {
169 ASSERT(space == kOld); 177 ASSERT(space == kOld);
170 old_space_.AllocateExternal(size); 178 old_space_.AllocateExternal(size);
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 MicrosecondsToMilliseconds(stats_.times_[2]), 760 MicrosecondsToMilliseconds(stats_.times_[2]),
753 MicrosecondsToMilliseconds(stats_.times_[3]), 761 MicrosecondsToMilliseconds(stats_.times_[3]),
754 stats_.data_[0], 762 stats_.data_[0],
755 stats_.data_[1], 763 stats_.data_[1],
756 stats_.data_[2], 764 stats_.data_[2],
757 stats_.data_[3]); 765 stats_.data_[3]);
758 } 766 }
759 767
760 768
761 #if defined(DEBUG) 769 #if defined(DEBUG)
762 NoSafepointScope::NoSafepointScope() : StackResource(Isolate::Current()) { 770 NoSafepointScope::NoSafepointScope() : StackResource(Thread::Current()) {
763 isolate()->IncrementNoSafepointScopeDepth(); 771 thread()->IncrementNoSafepointScopeDepth();
764 } 772 }
765 773
766 774
767 NoSafepointScope::~NoSafepointScope() { 775 NoSafepointScope::~NoSafepointScope() {
768 isolate()->DecrementNoSafepointScopeDepth(); 776 thread()->DecrementNoSafepointScopeDepth();
769 } 777 }
770 #endif // defined(DEBUG) 778 #endif // defined(DEBUG)
771 779
772 780
773 NoHeapGrowthControlScope::NoHeapGrowthControlScope() 781 NoHeapGrowthControlScope::NoHeapGrowthControlScope()
774 : StackResource(Isolate::Current()) { 782 : StackResource(Isolate::Current()) {
775 Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); 783 Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
776 current_growth_controller_state_ = heap->GrowthControlState(); 784 current_growth_controller_state_ = heap->GrowthControlState();
777 heap->DisableGrowthControl(); 785 heap->DisableGrowthControl();
778 } 786 }
779 787
780 788
781 NoHeapGrowthControlScope::~NoHeapGrowthControlScope() { 789 NoHeapGrowthControlScope::~NoHeapGrowthControlScope() {
782 Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap(); 790 Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
783 heap->SetGrowthControlState(current_growth_controller_state_); 791 heap->SetGrowthControlState(current_growth_controller_state_);
784 } 792 }
785 793
786 } // namespace dart 794 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/heap_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698