| 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/virtual_memory.h" | 10 #include "vm/virtual_memory.h" |
| 11 | 11 |
| 12 namespace dart { | 12 namespace dart { |
| 13 | 13 |
| 14 DECLARE_FLAG(bool, collect_code); | 14 DECLARE_FLAG(bool, collect_code); |
| 15 DECLARE_FLAG(bool, log_code_drop); | 15 DECLARE_FLAG(bool, log_code_drop); |
| 16 | 16 |
| 17 // Forward declarations. | 17 // Forward declarations. |
| 18 class Heap; | 18 class Heap; |
| 19 class ObjectPointerVisitor; | 19 class ObjectPointerVisitor; |
| 20 | 20 |
| 21 // An aligned page containing old generation objects. Alignment is used to be | 21 // A page containing old generation objects. |
| 22 // able to get to a HeapPage header quickly based on a pointer to an object. | |
| 23 class HeapPage { | 22 class HeapPage { |
| 24 public: | 23 public: |
| 25 enum PageType { | 24 enum PageType { |
| 26 kData = 0, | 25 kData = 0, |
| 27 kExecutable, | 26 kExecutable, |
| 28 kNumPageTypes | 27 kNumPageTypes |
| 29 }; | 28 }; |
| 30 | 29 |
| 31 HeapPage* next() const { return next_; } | 30 HeapPage* next() const { return next_; } |
| 32 void set_next(HeapPage* next) { next_ = next; } | 31 void set_next(HeapPage* next) { next_ = next; } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 57 return Utils::RoundUp(sizeof(HeapPage), OS::kMaxPreferredCodeAlignment); | 56 return Utils::RoundUp(sizeof(HeapPage), OS::kMaxPreferredCodeAlignment); |
| 58 } | 57 } |
| 59 | 58 |
| 60 private: | 59 private: |
| 61 void set_object_end(uword val) { | 60 void set_object_end(uword val) { |
| 62 ASSERT((val & kObjectAlignmentMask) == kOldObjectAlignmentOffset); | 61 ASSERT((val & kObjectAlignmentMask) == kOldObjectAlignmentOffset); |
| 63 object_end_ = val; | 62 object_end_ = val; |
| 64 } | 63 } |
| 65 | 64 |
| 66 static HeapPage* Initialize(VirtualMemory* memory, PageType type); | 65 static HeapPage* Initialize(VirtualMemory* memory, PageType type); |
| 67 static HeapPage* Allocate(intptr_t size, PageType type); | 66 static HeapPage* Allocate(intptr_t size_in_words, PageType type); |
| 68 | 67 |
| 69 // Deallocate the virtual memory backing this page. The page pointer to this | 68 // Deallocate the virtual memory backing this page. The page pointer to this |
| 70 // page becomes immediately inaccessible. | 69 // page becomes immediately inaccessible. |
| 71 void Deallocate(); | 70 void Deallocate(); |
| 72 | 71 |
| 73 VirtualMemory* memory_; | 72 VirtualMemory* memory_; |
| 74 HeapPage* next_; | 73 HeapPage* next_; |
| 75 uword object_end_; | 74 uword object_end_; |
| 76 bool executable_; | 75 bool executable_; |
| 77 | 76 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 | 163 |
| 165 PageSpaceGarbageCollectionHistory history_; | 164 PageSpaceGarbageCollectionHistory history_; |
| 166 | 165 |
| 167 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpaceController); | 166 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpaceController); |
| 168 }; | 167 }; |
| 169 | 168 |
| 170 | 169 |
| 171 class PageSpace { | 170 class PageSpace { |
| 172 public: | 171 public: |
| 173 // TODO(iposva): Determine heap sizes and tune the page size accordingly. | 172 // TODO(iposva): Determine heap sizes and tune the page size accordingly. |
| 174 static const intptr_t kPageSize = 256 * KB; | 173 static const intptr_t kPageSizeInWords = 256 * KBInWords; |
| 175 static const intptr_t kPageAlignment = kPageSize; | |
| 176 | 174 |
| 177 enum GrowthPolicy { | 175 enum GrowthPolicy { |
| 178 kControlGrowth, | 176 kControlGrowth, |
| 179 kForceGrowth | 177 kForceGrowth |
| 180 }; | 178 }; |
| 181 | 179 |
| 182 PageSpace(Heap* heap, intptr_t max_capacity_in_words); | 180 PageSpace(Heap* heap, intptr_t max_capacity_in_words); |
| 183 ~PageSpace(); | 181 ~PageSpace(); |
| 184 | 182 |
| 185 uword TryAllocate(intptr_t size, | 183 uword TryAllocate(intptr_t size, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 }; | 234 }; |
| 237 | 235 |
| 238 static const intptr_t kAllocatablePageSize = 64 * KB; | 236 static const intptr_t kAllocatablePageSize = 64 * KB; |
| 239 | 237 |
| 240 HeapPage* AllocatePage(HeapPage::PageType type); | 238 HeapPage* AllocatePage(HeapPage::PageType type); |
| 241 void FreePage(HeapPage* page, HeapPage* previous_page); | 239 void FreePage(HeapPage* page, HeapPage* previous_page); |
| 242 HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type); | 240 HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type); |
| 243 void FreeLargePage(HeapPage* page, HeapPage* previous_page); | 241 void FreeLargePage(HeapPage* page, HeapPage* previous_page); |
| 244 void FreePages(HeapPage* pages); | 242 void FreePages(HeapPage* pages); |
| 245 | 243 |
| 246 static intptr_t LargePageSizeFor(intptr_t size); | 244 static intptr_t LargePageSizeInWordsFor(intptr_t size); |
| 247 | 245 |
| 248 bool CanIncreaseCapacityInWords(intptr_t increase_in_words) { | 246 bool CanIncreaseCapacityInWords(intptr_t increase_in_words) { |
| 249 ASSERT(capacity_in_words_ <= max_capacity_in_words_); | 247 ASSERT(capacity_in_words_ <= max_capacity_in_words_); |
| 250 return increase_in_words <= (max_capacity_in_words_ - capacity_in_words_); | 248 return increase_in_words <= (max_capacity_in_words_ - capacity_in_words_); |
| 251 } | 249 } |
| 252 | 250 |
| 253 FreeList freelist_[HeapPage::kNumPageTypes]; | 251 FreeList freelist_[HeapPage::kNumPageTypes]; |
| 254 | 252 |
| 255 Heap* heap_; | 253 Heap* heap_; |
| 256 | 254 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 269 PageSpaceController page_space_controller_; | 267 PageSpaceController page_space_controller_; |
| 270 | 268 |
| 271 friend class PageSpaceController; | 269 friend class PageSpaceController; |
| 272 | 270 |
| 273 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace); | 271 DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace); |
| 274 }; | 272 }; |
| 275 | 273 |
| 276 } // namespace dart | 274 } // namespace dart |
| 277 | 275 |
| 278 #endif // VM_PAGES_H_ | 276 #endif // VM_PAGES_H_ |
| OLD | NEW |