| 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/lockers.h" | 10 #include "vm/lockers.h" |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 class PageSpace { | 189 class PageSpace { |
| 190 public: | 190 public: |
| 191 // TODO(iposva): Determine heap sizes and tune the page size accordingly. | 191 // TODO(iposva): Determine heap sizes and tune the page size accordingly. |
| 192 static const intptr_t kPageSizeInWords = 256 * KBInWords; | 192 static const intptr_t kPageSizeInWords = 256 * KBInWords; |
| 193 | 193 |
| 194 enum GrowthPolicy { | 194 enum GrowthPolicy { |
| 195 kControlGrowth, | 195 kControlGrowth, |
| 196 kForceGrowth | 196 kForceGrowth |
| 197 }; | 197 }; |
| 198 | 198 |
| 199 PageSpace(Heap* heap, intptr_t max_capacity_in_words); | 199 PageSpace(Heap* heap, |
| 200 intptr_t max_capacity_in_words, |
| 201 intptr_t max_external_in_words); |
| 200 ~PageSpace(); | 202 ~PageSpace(); |
| 201 | 203 |
| 202 uword TryAllocate(intptr_t size, | 204 uword TryAllocate(intptr_t size, |
| 203 HeapPage::PageType type = HeapPage::kData, | 205 HeapPage::PageType type = HeapPage::kData, |
| 204 GrowthPolicy growth_policy = kControlGrowth) { | 206 GrowthPolicy growth_policy = kControlGrowth) { |
| 205 bool is_protected = | 207 bool is_protected = |
| 206 (type == HeapPage::kExecutable) && FLAG_write_protect_code; | 208 (type == HeapPage::kExecutable) && FLAG_write_protect_code; |
| 207 bool is_locked = false; | 209 bool is_locked = false; |
| 208 return TryAllocateInternal( | 210 return TryAllocateInternal( |
| 209 size, type, growth_policy, is_protected, is_locked); | 211 size, type, growth_policy, is_protected, is_locked); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 } else { | 264 } else { |
| 263 page_space_controller_.Disable(); | 265 page_space_controller_.Disable(); |
| 264 } | 266 } |
| 265 } | 267 } |
| 266 | 268 |
| 267 bool GrowthControlState() { | 269 bool GrowthControlState() { |
| 268 return page_space_controller_.is_enabled(); | 270 return page_space_controller_.is_enabled(); |
| 269 } | 271 } |
| 270 | 272 |
| 271 bool NeedsExternalGC() const { | 273 bool NeedsExternalGC() const { |
| 272 return UsedInWords() + ExternalInWords() > max_capacity_in_words_; | 274 return (max_external_in_words_ != 0) && |
| 275 (ExternalInWords() > max_external_in_words_); |
| 273 } | 276 } |
| 274 | 277 |
| 275 // TODO(koda): Unify protection handling. | 278 // TODO(koda): Unify protection handling. |
| 276 void WriteProtect(bool read_only); | 279 void WriteProtect(bool read_only); |
| 277 void WriteProtectCode(bool read_only); | 280 void WriteProtectCode(bool read_only); |
| 278 | 281 |
| 279 void AddGCTime(int64_t micros) { | 282 void AddGCTime(int64_t micros) { |
| 280 gc_time_micros_ += micros; | 283 gc_time_micros_ += micros; |
| 281 } | 284 } |
| 282 | 285 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 ASSERT((exec_pages_tail_ == NULL) || (exec_pages_tail_->next() == NULL)); | 378 ASSERT((exec_pages_tail_ == NULL) || (exec_pages_tail_->next() == NULL)); |
| 376 if (page == pages_tail_) { | 379 if (page == pages_tail_) { |
| 377 return (exec_pages_ != NULL) ? exec_pages_ : large_pages_; | 380 return (exec_pages_ != NULL) ? exec_pages_ : large_pages_; |
| 378 } | 381 } |
| 379 return page == exec_pages_tail_ ? large_pages_ : page->next(); | 382 return page == exec_pages_tail_ ? large_pages_ : page->next(); |
| 380 } | 383 } |
| 381 | 384 |
| 382 static intptr_t LargePageSizeInWordsFor(intptr_t size); | 385 static intptr_t LargePageSizeInWordsFor(intptr_t size); |
| 383 | 386 |
| 384 bool CanIncreaseCapacityInWords(intptr_t increase_in_words) { | 387 bool CanIncreaseCapacityInWords(intptr_t increase_in_words) { |
| 388 if (max_capacity_in_words_ == 0) { |
| 389 // Unlimited. |
| 390 return true; |
| 391 } |
| 385 ASSERT(CapacityInWords() <= max_capacity_in_words_); | 392 ASSERT(CapacityInWords() <= max_capacity_in_words_); |
| 386 return increase_in_words <= (max_capacity_in_words_ - CapacityInWords()); | 393 return increase_in_words <= (max_capacity_in_words_ - CapacityInWords()); |
| 387 } | 394 } |
| 388 | 395 |
| 389 FreeList freelist_[HeapPage::kNumPageTypes]; | 396 FreeList freelist_[HeapPage::kNumPageTypes]; |
| 390 | 397 |
| 391 Heap* heap_; | 398 Heap* heap_; |
| 392 | 399 |
| 393 // Use ExclusivePageIterator for safe access to these. | 400 // Use ExclusivePageIterator for safe access to these. |
| 394 Mutex* pages_lock_; | 401 Mutex* pages_lock_; |
| 395 HeapPage* pages_; | 402 HeapPage* pages_; |
| 396 HeapPage* pages_tail_; | 403 HeapPage* pages_tail_; |
| 397 HeapPage* exec_pages_; | 404 HeapPage* exec_pages_; |
| 398 HeapPage* exec_pages_tail_; | 405 HeapPage* exec_pages_tail_; |
| 399 HeapPage* large_pages_; | 406 HeapPage* large_pages_; |
| 400 | 407 |
| 401 // A block of memory in a data page, managed by bump allocation. The remainder | 408 // A block of memory in a data page, managed by bump allocation. The remainder |
| 402 // is kept formatted as a FreeListElement, but is not in any freelist. | 409 // is kept formatted as a FreeListElement, but is not in any freelist. |
| 403 uword bump_top_; | 410 uword bump_top_; |
| 404 uword bump_end_; | 411 uword bump_end_; |
| 405 | 412 |
| 406 // Various sizes being tracked for this generation. | 413 // Various sizes being tracked for this generation. |
| 407 intptr_t max_capacity_in_words_; | 414 intptr_t max_capacity_in_words_; |
| 415 intptr_t max_external_in_words_; |
| 408 // NOTE: The capacity component of usage_ is updated by the concurrent | 416 // NOTE: The capacity component of usage_ is updated by the concurrent |
| 409 // sweeper. Use (Increase)CapacityInWords(Locked) for thread-safe access. | 417 // sweeper. Use (Increase)CapacityInWords(Locked) for thread-safe access. |
| 410 SpaceUsage usage_; | 418 SpaceUsage usage_; |
| 411 | 419 |
| 412 // Keep track of running MarkSweep tasks. | 420 // Keep track of running MarkSweep tasks. |
| 413 Monitor* tasks_lock_; | 421 Monitor* tasks_lock_; |
| 414 intptr_t tasks_; | 422 intptr_t tasks_; |
| 415 | 423 |
| 416 PageSpaceController page_space_controller_; | 424 PageSpaceController page_space_controller_; |
| 417 | 425 |
| 418 int64_t gc_time_micros_; | 426 int64_t gc_time_micros_; |
| 419 intptr_t collections_; | 427 intptr_t collections_; |
| 420 | 428 |
| 421 friend class ExclusivePageIterator; | 429 friend class ExclusivePageIterator; |
| 422 friend class ExclusiveCodePageIterator; | 430 friend class ExclusiveCodePageIterator; |
| 423 friend class ExclusiveLargePageIterator; | 431 friend class ExclusiveLargePageIterator; |
| 424 friend class PageSpaceController; | 432 friend class PageSpaceController; |
| 425 friend class SweeperTask; | 433 friend class SweeperTask; |
| 426 | 434 |
| 427 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace); | 435 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace); |
| 428 }; | 436 }; |
| 429 | 437 |
| 430 } // namespace dart | 438 } // namespace dart |
| 431 | 439 |
| 432 #endif // VM_PAGES_H_ | 440 #endif // VM_PAGES_H_ |
| OLD | NEW |