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

Side by Side Diff: runtime/vm/pages.h

Issue 220723010: Generalize the interface of page space controller. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 #ifndef VM_PAGES_H_ 5 #ifndef VM_PAGES_H_
6 #define VM_PAGES_H_ 6 #define VM_PAGES_H_
7 7
8 #include "vm/freelist.h" 8 #include "vm/freelist.h"
9 #include "vm/globals.h" 9 #include "vm/globals.h"
10 #include "vm/spaces.h"
10 #include "vm/virtual_memory.h" 11 #include "vm/virtual_memory.h"
11 12
12 namespace dart { 13 namespace dart {
13 14
14 DECLARE_FLAG(bool, collect_code); 15 DECLARE_FLAG(bool, collect_code);
15 DECLARE_FLAG(bool, log_code_drop); 16 DECLARE_FLAG(bool, log_code_drop);
16 DECLARE_FLAG(bool, always_drop_code); 17 DECLARE_FLAG(bool, always_drop_code);
17 18
18 // Forward declarations. 19 // Forward declarations.
19 class Heap; 20 class Heap;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 // and if the relative GC time is below a given threshold, 110 // and if the relative GC time is below a given threshold,
110 // then the heap is not grown when the next GC decision is made. 111 // then the heap is not grown when the next GC decision is made.
111 // PageSpaceController controls the heap size. 112 // PageSpaceController controls the heap size.
112 class PageSpaceController { 113 class PageSpaceController {
113 public: 114 public:
114 PageSpaceController(int heap_growth_ratio, 115 PageSpaceController(int heap_growth_ratio,
115 int heap_growth_rate, 116 int heap_growth_rate,
116 int garbage_collection_time_ratio); 117 int garbage_collection_time_ratio);
117 ~PageSpaceController(); 118 ~PageSpaceController();
118 119
119 bool CanGrowPageSpace(intptr_t size_in_bytes); 120 // Returns whether growing to 'after' should trigger a GC.
121 // This method can be called before allocation (e.g., pretenuring) or after
122 // (e.g., promotion), as it does not change the state of the controller.
123 bool NeedsGarbageCollection(SpaceUsage after) const;
120 124
125 // Should be called after each collection to update the controller state.
121 // A garbage collection is considered as successful if more than 126 // A garbage collection is considered as successful if more than
122 // heap_growth_ratio % of memory got deallocated by the garbage collector. 127 // heap_growth_ratio % of memory got deallocated by the garbage collector.
123 // In this case garbage collection will be performed next time. Otherwise 128 // In this case garbage collection will be performed next time. Otherwise
124 // the heap will grow. 129 // the heap will grow.
125 void EvaluateGarbageCollection(intptr_t used_before_in_words, 130 void EvaluateGarbageCollection(SpaceUsage before,
126 intptr_t used_after_in_words, 131 SpaceUsage after,
127 int64_t start, int64_t end); 132 int64_t start, int64_t end);
128 133
129 int64_t last_code_collection_in_us() { return last_code_collection_in_us_; } 134 int64_t last_code_collection_in_us() { return last_code_collection_in_us_; }
130 void set_last_code_collection_in_us(int64_t t) { 135 void set_last_code_collection_in_us(int64_t t) {
131 last_code_collection_in_us_ = t; 136 last_code_collection_in_us_ = t;
132 } 137 }
133 138
134 void set_is_enabled(bool state) { 139 void set_is_enabled(bool state) {
135 is_enabled_ = state; 140 is_enabled_ = state;
136 } 141 }
137 bool is_enabled() { 142 bool is_enabled() {
138 return is_enabled_; 143 return is_enabled_;
139 } 144 }
140 145
141 private: 146 private:
142 bool is_enabled_; 147 bool is_enabled_;
143 148
149 // Usage after last evaluated GC.
150 SpaceUsage last_usage_;
151
144 // Heap growth control variable. 152 // Heap growth control variable.
145 intptr_t grow_heap_; 153 intptr_t grow_heap_;
146 154
147 // If the garbage collector was not able to free more than heap_growth_ratio_ 155 // If the garbage collector was not able to free more than heap_growth_ratio_
148 // memory, then the heap is grown. Otherwise garbage collection is performed. 156 // memory, then the heap is grown. Otherwise garbage collection is performed.
149 int heap_growth_ratio_; 157 int heap_growth_ratio_;
150 158
151 // The desired percent of heap in-use after a garbage collection. 159 // The desired percent of heap in-use after a garbage collection.
152 // Equivalent to \frac{100-heap_growth_ratio_}{100}. 160 // Equivalent to \frac{100-heap_growth_ratio_}{100}.
153 double desired_utilization_; 161 double desired_utilization_;
(...skipping 25 matching lines...) Expand all
179 kForceGrowth 187 kForceGrowth
180 }; 188 };
181 189
182 PageSpace(Heap* heap, intptr_t max_capacity_in_words); 190 PageSpace(Heap* heap, intptr_t max_capacity_in_words);
183 ~PageSpace(); 191 ~PageSpace();
184 192
185 uword TryAllocate(intptr_t size, 193 uword TryAllocate(intptr_t size,
186 HeapPage::PageType type = HeapPage::kData, 194 HeapPage::PageType type = HeapPage::kData,
187 GrowthPolicy growth_policy = kControlGrowth); 195 GrowthPolicy growth_policy = kControlGrowth);
188 196
189 intptr_t UsedInWords() const { return used_in_words_; } 197 bool NeedsGarbageCollection() const {
190 intptr_t CapacityInWords() const { return capacity_in_words_; } 198 return page_space_controller_.NeedsGarbageCollection(usage_);
199 }
200
201 intptr_t UsedInWords() const { return usage_.used_in_words; }
202 intptr_t CapacityInWords() const { return usage_.capacity_in_words; }
191 intptr_t ExternalInWords() const { 203 intptr_t ExternalInWords() const {
192 return external_in_words_; 204 return usage_.external_in_words;
193 } 205 }
206 SpaceUsage GetCurrentUsage() const { return usage_; }
194 207
195 bool Contains(uword addr) const; 208 bool Contains(uword addr) const;
196 bool Contains(uword addr, HeapPage::PageType type) const; 209 bool Contains(uword addr, HeapPage::PageType type) const;
197 bool IsValidAddress(uword addr) const { 210 bool IsValidAddress(uword addr) const {
198 return Contains(addr); 211 return Contains(addr);
199 } 212 }
200 213
201 void VisitObjects(ObjectVisitor* visitor) const; 214 void VisitObjects(ObjectVisitor* visitor) const;
202 void VisitObjectPointers(ObjectPointerVisitor* visitor) const; 215 void VisitObjectPointers(ObjectPointerVisitor* visitor) const;
203 216
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 277
265 HeapPage* AllocatePage(HeapPage::PageType type); 278 HeapPage* AllocatePage(HeapPage::PageType type);
266 void FreePage(HeapPage* page, HeapPage* previous_page); 279 void FreePage(HeapPage* page, HeapPage* previous_page);
267 HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type); 280 HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type);
268 void FreeLargePage(HeapPage* page, HeapPage* previous_page); 281 void FreeLargePage(HeapPage* page, HeapPage* previous_page);
269 void FreePages(HeapPage* pages); 282 void FreePages(HeapPage* pages);
270 283
271 static intptr_t LargePageSizeInWordsFor(intptr_t size); 284 static intptr_t LargePageSizeInWordsFor(intptr_t size);
272 285
273 bool CanIncreaseCapacityInWords(intptr_t increase_in_words) { 286 bool CanIncreaseCapacityInWords(intptr_t increase_in_words) {
274 ASSERT(capacity_in_words_ <= max_capacity_in_words_); 287 ASSERT(CapacityInWords() <= max_capacity_in_words_);
275 return increase_in_words <= (max_capacity_in_words_ - capacity_in_words_); 288 return increase_in_words <= (max_capacity_in_words_ - CapacityInWords());
276 } 289 }
277 290
278 FreeList freelist_[HeapPage::kNumPageTypes]; 291 FreeList freelist_[HeapPage::kNumPageTypes];
279 292
280 Heap* heap_; 293 Heap* heap_;
281 294
282 HeapPage* pages_; 295 HeapPage* pages_;
283 HeapPage* pages_tail_; 296 HeapPage* pages_tail_;
284 HeapPage* large_pages_; 297 HeapPage* large_pages_;
285 298
286 // Various sizes being tracked for this generation. 299 // Various sizes being tracked for this generation.
287 intptr_t max_capacity_in_words_; 300 intptr_t max_capacity_in_words_;
288 intptr_t capacity_in_words_; 301 SpaceUsage usage_;
289 intptr_t used_in_words_;
290 intptr_t external_in_words_;
291 302
292 // Keep track whether a MarkSweep is currently running. 303 // Keep track whether a MarkSweep is currently running.
293 bool sweeping_; 304 bool sweeping_;
294 305
295 PageSpaceController page_space_controller_; 306 PageSpaceController page_space_controller_;
296 307
297 int64_t gc_time_micros_; 308 int64_t gc_time_micros_;
298 intptr_t collections_; 309 intptr_t collections_;
299 310
300 friend class PageSpaceController; 311 friend class PageSpaceController;
301 312
302 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace); 313 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace);
303 }; 314 };
304 315
305 } // namespace dart 316 } // namespace dart
306 317
307 #endif // VM_PAGES_H_ 318 #endif // VM_PAGES_H_
OLDNEW
« no previous file with comments | « runtime/vm/heap.cc ('k') | runtime/vm/pages.cc » ('j') | runtime/vm/pages.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698