Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/ring_buffer.h" | 10 #include "vm/ring_buffer.h" |
| 11 #include "vm/spaces.h" | 11 #include "vm/spaces.h" |
| 12 #include "vm/virtual_memory.h" | 12 #include "vm/virtual_memory.h" |
| 13 | 13 |
| 14 namespace dart { | 14 namespace dart { |
| 15 | 15 |
| 16 DECLARE_FLAG(bool, collect_code); | 16 DECLARE_FLAG(bool, collect_code); |
| 17 DECLARE_FLAG(bool, log_code_drop); | 17 DECLARE_FLAG(bool, log_code_drop); |
| 18 DECLARE_FLAG(bool, always_drop_code); | 18 DECLARE_FLAG(bool, always_drop_code); |
| 19 DECLARE_FLAG(bool, write_protect_code); | |
| 19 | 20 |
| 20 // Forward declarations. | 21 // Forward declarations. |
| 21 class Heap; | 22 class Heap; |
| 22 class JSONObject; | 23 class JSONObject; |
| 23 class ObjectPointerVisitor; | 24 class ObjectPointerVisitor; |
| 24 | 25 |
| 25 // A page containing old generation objects. | 26 // A page containing old generation objects. |
| 26 class HeapPage { | 27 class HeapPage { |
| 27 public: | 28 public: |
| 28 enum PageType { | 29 enum PageType { |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 enum GrowthPolicy { | 193 enum GrowthPolicy { |
| 193 kControlGrowth, | 194 kControlGrowth, |
| 194 kForceGrowth | 195 kForceGrowth |
| 195 }; | 196 }; |
| 196 | 197 |
| 197 PageSpace(Heap* heap, intptr_t max_capacity_in_words); | 198 PageSpace(Heap* heap, intptr_t max_capacity_in_words); |
| 198 ~PageSpace(); | 199 ~PageSpace(); |
| 199 | 200 |
| 200 uword TryAllocate(intptr_t size, | 201 uword TryAllocate(intptr_t size, |
| 201 HeapPage::PageType type = HeapPage::kData, | 202 HeapPage::PageType type = HeapPage::kData, |
| 202 GrowthPolicy growth_policy = kControlGrowth); | 203 GrowthPolicy growth_policy = kControlGrowth) { |
| 204 bool is_protected = | |
| 205 (type == HeapPage::kExecutable) && FLAG_write_protect_code; | |
| 206 return TryAllocateInternal(size, type, growth_policy, is_protected, false); | |
|
koda
2014/08/20 00:10:21
Comment 'false' (or use a local).
Ivan Posva
2014/08/20 03:50:53
Done.
| |
| 207 } | |
| 203 | 208 |
| 204 bool NeedsGarbageCollection() const { | 209 bool NeedsGarbageCollection() const { |
| 205 return page_space_controller_.NeedsGarbageCollection(usage_) || | 210 return page_space_controller_.NeedsGarbageCollection(usage_) || |
| 206 NeedsExternalGC(); | 211 NeedsExternalGC(); |
| 207 } | 212 } |
| 208 | 213 |
| 209 intptr_t UsedInWords() const { return usage_.used_in_words; } | 214 intptr_t UsedInWords() const { return usage_.used_in_words; } |
| 210 intptr_t CapacityInWords() const { return usage_.capacity_in_words; } | 215 intptr_t CapacityInWords() const { return usage_.capacity_in_words; } |
| 211 intptr_t ExternalInWords() const { | 216 intptr_t ExternalInWords() const { |
| 212 return usage_.external_in_words; | 217 return usage_.external_in_words; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 269 intptr_t collections() const { | 274 intptr_t collections() const { |
| 270 return collections_; | 275 return collections_; |
| 271 } | 276 } |
| 272 | 277 |
| 273 void PrintToJSONObject(JSONObject* object); | 278 void PrintToJSONObject(JSONObject* object); |
| 274 void PrintHeapMapToJSONStream(Isolate* isolate, JSONStream* stream); | 279 void PrintHeapMapToJSONStream(Isolate* isolate, JSONStream* stream); |
| 275 | 280 |
| 276 void AllocateExternal(intptr_t size); | 281 void AllocateExternal(intptr_t size); |
| 277 void FreeExternal(intptr_t size); | 282 void FreeExternal(intptr_t size); |
| 278 | 283 |
| 284 // Bulk data allocation. | |
| 285 void AcquireDataLock(); | |
| 286 void ReleaseDataLock(); | |
| 287 | |
| 288 uword TryAllocateDataLocked(intptr_t size, GrowthPolicy growth_policy) { | |
| 289 return TryAllocateInternal(size, | |
| 290 HeapPage::kData, | |
| 291 growth_policy, | |
| 292 false, true); | |
|
koda
2014/08/20 00:10:21
Comment 'false' and 'true'.
Ivan Posva
2014/08/20 03:50:54
Done.
| |
| 293 } | |
| 294 | |
| 279 private: | 295 private: |
| 280 // Ids for time and data records in Heap::GCStats. | 296 // Ids for time and data records in Heap::GCStats. |
| 281 enum { | 297 enum { |
| 282 // Time | 298 // Time |
| 283 kMarkObjects = 0, | 299 kMarkObjects = 0, |
| 284 kResetFreeLists = 1, | 300 kResetFreeLists = 1, |
| 285 kSweepPages = 2, | 301 kSweepPages = 2, |
| 286 kSweepLargePages = 3, | 302 kSweepLargePages = 3, |
| 287 // Data | 303 // Data |
| 288 kGarbageRatio = 0, | 304 kGarbageRatio = 0, |
| 289 kGCTimeFraction = 1, | 305 kGCTimeFraction = 1, |
| 290 kPageGrowth = 2, | 306 kPageGrowth = 2, |
| 291 kAllowedGrowth = 3 | 307 kAllowedGrowth = 3 |
| 292 }; | 308 }; |
| 293 | 309 |
| 310 Monitor* tasks_lock() const { return tasks_lock_; } | |
| 311 intptr_t tasks() const { return tasks_; } | |
| 312 void set_tasks(intptr_t val) { tasks_ = val; } | |
| 313 | |
| 294 static const intptr_t kAllocatablePageSize = 64 * KB; | 314 static const intptr_t kAllocatablePageSize = 64 * KB; |
| 295 | 315 |
| 316 uword TryAllocateInternal(intptr_t size, | |
| 317 HeapPage::PageType type, | |
| 318 GrowthPolicy growth_policy, | |
| 319 bool is_protected, | |
| 320 bool is_locked); | |
| 296 HeapPage* AllocatePage(HeapPage::PageType type); | 321 HeapPage* AllocatePage(HeapPage::PageType type); |
| 297 void FreePage(HeapPage* page, HeapPage* previous_page); | 322 void FreePage(HeapPage* page, HeapPage* previous_page); |
| 298 HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type); | 323 HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type); |
| 299 void TruncateLargePage(HeapPage* page, intptr_t new_object_size_in_bytes); | 324 void TruncateLargePage(HeapPage* page, intptr_t new_object_size_in_bytes); |
| 300 void FreeLargePage(HeapPage* page, HeapPage* previous_page); | 325 void FreeLargePage(HeapPage* page, HeapPage* previous_page); |
| 301 void FreePages(HeapPage* pages); | 326 void FreePages(HeapPage* pages); |
| 302 HeapPage* NextPageAnySize(HeapPage* page) const { | 327 HeapPage* NextPageAnySize(HeapPage* page) const { |
| 303 ASSERT(pages_tail_ == NULL || pages_tail_->next() == NULL); | 328 ASSERT(pages_tail_ == NULL || pages_tail_->next() == NULL); |
| 304 return page == pages_tail_ ? large_pages_ : page->next(); | 329 return page == pages_tail_ ? large_pages_ : page->next(); |
| 305 } | 330 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 316 Heap* heap_; | 341 Heap* heap_; |
| 317 | 342 |
| 318 HeapPage* pages_; | 343 HeapPage* pages_; |
| 319 HeapPage* pages_tail_; | 344 HeapPage* pages_tail_; |
| 320 HeapPage* large_pages_; | 345 HeapPage* large_pages_; |
| 321 | 346 |
| 322 // Various sizes being tracked for this generation. | 347 // Various sizes being tracked for this generation. |
| 323 intptr_t max_capacity_in_words_; | 348 intptr_t max_capacity_in_words_; |
| 324 SpaceUsage usage_; | 349 SpaceUsage usage_; |
| 325 | 350 |
| 326 // Keep track whether a MarkSweep is currently running. | 351 // Keep track of running MarkSweep tasks. |
| 327 bool sweeping_; | 352 Monitor* tasks_lock_; |
| 353 intptr_t tasks_; | |
| 328 | 354 |
| 329 PageSpaceController page_space_controller_; | 355 PageSpaceController page_space_controller_; |
| 330 | 356 |
| 331 int64_t gc_time_micros_; | 357 int64_t gc_time_micros_; |
| 332 intptr_t collections_; | 358 intptr_t collections_; |
| 333 | 359 |
| 334 friend class PageSpaceController; | 360 friend class PageSpaceController; |
| 335 | 361 |
| 336 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace); | 362 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace); |
| 337 }; | 363 }; |
| 338 | 364 |
| 339 } // namespace dart | 365 } // namespace dart |
| 340 | 366 |
| 341 #endif // VM_PAGES_H_ | 367 #endif // VM_PAGES_H_ |
| OLD | NEW |