OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_HEAP_SPACES_H_ | 5 #ifndef V8_HEAP_SPACES_H_ |
6 #define V8_HEAP_SPACES_H_ | 6 #define V8_HEAP_SPACES_H_ |
7 | 7 |
8 #include <list> | 8 #include <list> |
9 #include <memory> | 9 #include <memory> |
10 #include <unordered_set> | 10 #include <unordered_set> |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 | 810 |
811 bool is_anchor() { return IsFlagSet(Page::ANCHOR); } | 811 bool is_anchor() { return IsFlagSet(Page::ANCHOR); } |
812 | 812 |
813 intptr_t wasted_memory() { return wasted_memory_.Value(); } | 813 intptr_t wasted_memory() { return wasted_memory_.Value(); } |
814 void add_wasted_memory(intptr_t waste) { wasted_memory_.Increment(waste); } | 814 void add_wasted_memory(intptr_t waste) { wasted_memory_.Increment(waste); } |
815 intptr_t available_in_free_list() { return available_in_free_list_.Value(); } | 815 intptr_t available_in_free_list() { return available_in_free_list_.Value(); } |
816 void add_available_in_free_list(intptr_t available) { | 816 void add_available_in_free_list(intptr_t available) { |
817 available_in_free_list_.Increment(available); | 817 available_in_free_list_.Increment(available); |
818 } | 818 } |
819 | 819 |
| 820 size_t ShrinkToHighWaterMark(); |
| 821 |
820 #ifdef DEBUG | 822 #ifdef DEBUG |
821 void Print(); | 823 void Print(); |
822 #endif // DEBUG | 824 #endif // DEBUG |
823 | 825 |
824 private: | 826 private: |
825 enum InitializationMode { kFreeMemory, kDoNotFreeMemory }; | 827 enum InitializationMode { kFreeMemory, kDoNotFreeMemory }; |
826 | 828 |
827 template <InitializationMode mode = kFreeMemory> | 829 template <InitializationMode mode = kFreeMemory> |
828 static inline Page* Initialize(Heap* heap, MemoryChunk* chunk, | 830 static inline Page* Initialize(Heap* heap, MemoryChunk* chunk, |
829 Executability executable, PagedSpace* owner); | 831 Executability executable, PagedSpace* owner); |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1298 void ReportStatistics(); | 1300 void ReportStatistics(); |
1299 #endif | 1301 #endif |
1300 | 1302 |
1301 // Returns a MemoryChunk in which the memory region from commit_area_size to | 1303 // Returns a MemoryChunk in which the memory region from commit_area_size to |
1302 // reserve_area_size of the chunk area is reserved but not committed, it | 1304 // reserve_area_size of the chunk area is reserved but not committed, it |
1303 // could be committed later by calling MemoryChunk::CommitArea. | 1305 // could be committed later by calling MemoryChunk::CommitArea. |
1304 MemoryChunk* AllocateChunk(intptr_t reserve_area_size, | 1306 MemoryChunk* AllocateChunk(intptr_t reserve_area_size, |
1305 intptr_t commit_area_size, | 1307 intptr_t commit_area_size, |
1306 Executability executable, Space* space); | 1308 Executability executable, Space* space); |
1307 | 1309 |
| 1310 void ShrinkChunk(MemoryChunk* chunk, size_t bytes_to_shrink); |
| 1311 |
1308 Address ReserveAlignedMemory(size_t requested, size_t alignment, | 1312 Address ReserveAlignedMemory(size_t requested, size_t alignment, |
1309 base::VirtualMemory* controller); | 1313 base::VirtualMemory* controller); |
1310 Address AllocateAlignedMemory(size_t reserve_size, size_t commit_size, | 1314 Address AllocateAlignedMemory(size_t reserve_size, size_t commit_size, |
1311 size_t alignment, Executability executable, | 1315 size_t alignment, Executability executable, |
1312 base::VirtualMemory* controller); | 1316 base::VirtualMemory* controller); |
1313 | 1317 |
1314 bool CommitMemory(Address addr, size_t size, Executability executable); | 1318 bool CommitMemory(Address addr, size_t size, Executability executable); |
1315 | 1319 |
1316 void FreeMemory(base::VirtualMemory* reservation, Executability executable); | 1320 void FreeMemory(base::VirtualMemory* reservation, Executability executable); |
1317 void PartialFreeMemory(MemoryChunk* chunk, Address start_free); | 1321 void PartialFreeMemory(MemoryChunk* chunk, Address start_free); |
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2179 FreeList* free_list() { return &free_list_; } | 2183 FreeList* free_list() { return &free_list_; } |
2180 | 2184 |
2181 base::Mutex* mutex() { return &space_mutex_; } | 2185 base::Mutex* mutex() { return &space_mutex_; } |
2182 | 2186 |
2183 inline void UnlinkFreeListCategories(Page* page); | 2187 inline void UnlinkFreeListCategories(Page* page); |
2184 inline intptr_t RelinkFreeListCategories(Page* page); | 2188 inline intptr_t RelinkFreeListCategories(Page* page); |
2185 | 2189 |
2186 iterator begin() { return iterator(anchor_.next_page()); } | 2190 iterator begin() { return iterator(anchor_.next_page()); } |
2187 iterator end() { return iterator(&anchor_); } | 2191 iterator end() { return iterator(&anchor_); } |
2188 | 2192 |
| 2193 // Shrink immortal immovable pages of the space to be exactly the size needed |
| 2194 // using the high water mark. |
| 2195 void ShrinkImmortalImmovablePages(); |
| 2196 |
2189 protected: | 2197 protected: |
2190 // PagedSpaces that should be included in snapshots have different, i.e., | 2198 // PagedSpaces that should be included in snapshots have different, i.e., |
2191 // smaller, initial pages. | 2199 // smaller, initial pages. |
2192 virtual bool snapshotable() { return true; } | 2200 virtual bool snapshotable() { return true; } |
2193 | 2201 |
2194 bool HasPages() { return anchor_.next_page() != &anchor_; } | 2202 bool HasPages() { return anchor_.next_page() != &anchor_; } |
2195 | 2203 |
2196 // Cleans up the space, frees all pages in this space except those belonging | 2204 // Cleans up the space, frees all pages in this space except those belonging |
2197 // to the initial chunk, uncommits addresses in the initial chunk. | 2205 // to the initial chunk, uncommits addresses in the initial chunk. |
2198 void TearDown(); | 2206 void TearDown(); |
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3031 count = 0; | 3039 count = 0; |
3032 } | 3040 } |
3033 // Must be small, since an iteration is used for lookup. | 3041 // Must be small, since an iteration is used for lookup. |
3034 static const int kMaxComments = 64; | 3042 static const int kMaxComments = 64; |
3035 }; | 3043 }; |
3036 #endif | 3044 #endif |
3037 } // namespace internal | 3045 } // namespace internal |
3038 } // namespace v8 | 3046 } // namespace v8 |
3039 | 3047 |
3040 #endif // V8_HEAP_SPACES_H_ | 3048 #endif // V8_HEAP_SPACES_H_ |
OLD | NEW |