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 925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
936 virtual intptr_t Available() = 0; | 936 virtual intptr_t Available() = 0; |
937 | 937 |
938 virtual int RoundSizeDownToObjectAlignment(int size) { | 938 virtual int RoundSizeDownToObjectAlignment(int size) { |
939 if (id_ == CODE_SPACE) { | 939 if (id_ == CODE_SPACE) { |
940 return RoundDown(size, kCodeAlignment); | 940 return RoundDown(size, kCodeAlignment); |
941 } else { | 941 } else { |
942 return RoundDown(size, kPointerSize); | 942 return RoundDown(size, kPointerSize); |
943 } | 943 } |
944 } | 944 } |
945 | 945 |
| 946 virtual std::unique_ptr<ObjectIterator> GetObjectIterator() = 0; |
| 947 |
946 void AccountCommitted(intptr_t bytes) { | 948 void AccountCommitted(intptr_t bytes) { |
947 DCHECK_GE(bytes, 0); | 949 DCHECK_GE(bytes, 0); |
948 committed_ += bytes; | 950 committed_ += bytes; |
949 if (committed_ > max_committed_) { | 951 if (committed_ > max_committed_) { |
950 max_committed_ = committed_; | 952 max_committed_ = committed_; |
951 } | 953 } |
952 } | 954 } |
953 | 955 |
954 void AccountUncommitted(intptr_t bytes) { | 956 void AccountUncommitted(intptr_t bytes) { |
955 DCHECK_GE(bytes, 0); | 957 DCHECK_GE(bytes, 0); |
(...skipping 1191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2147 inline void UnlinkFreeListCategories(Page* page); | 2149 inline void UnlinkFreeListCategories(Page* page); |
2148 inline intptr_t RelinkFreeListCategories(Page* page); | 2150 inline intptr_t RelinkFreeListCategories(Page* page); |
2149 | 2151 |
2150 iterator begin() { return iterator(anchor_.next_page()); } | 2152 iterator begin() { return iterator(anchor_.next_page()); } |
2151 iterator end() { return iterator(&anchor_); } | 2153 iterator end() { return iterator(&anchor_); } |
2152 | 2154 |
2153 // Shrink immortal immovable pages of the space to be exactly the size needed | 2155 // Shrink immortal immovable pages of the space to be exactly the size needed |
2154 // using the high water mark. | 2156 // using the high water mark. |
2155 void ShrinkImmortalImmovablePages(); | 2157 void ShrinkImmortalImmovablePages(); |
2156 | 2158 |
| 2159 std::unique_ptr<ObjectIterator> GetObjectIterator() override; |
| 2160 |
2157 protected: | 2161 protected: |
2158 // PagedSpaces that should be included in snapshots have different, i.e., | 2162 // PagedSpaces that should be included in snapshots have different, i.e., |
2159 // smaller, initial pages. | 2163 // smaller, initial pages. |
2160 virtual bool snapshotable() { return true; } | 2164 virtual bool snapshotable() { return true; } |
2161 | 2165 |
2162 bool HasPages() { return anchor_.next_page() != &anchor_; } | 2166 bool HasPages() { return anchor_.next_page() != &anchor_; } |
2163 | 2167 |
2164 // Cleans up the space, frees all pages in this space except those belonging | 2168 // Cleans up the space, frees all pages in this space except those belonging |
2165 // to the initial chunk, uncommits addresses in the initial chunk. | 2169 // to the initial chunk, uncommits addresses in the initial chunk. |
2166 void TearDown(); | 2170 void TearDown(); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2322 return 0; | 2326 return 0; |
2323 } | 2327 } |
2324 | 2328 |
2325 intptr_t SizeOfObjects() override { return Size(); } | 2329 intptr_t SizeOfObjects() override { return Size(); } |
2326 | 2330 |
2327 intptr_t Available() override { | 2331 intptr_t Available() override { |
2328 UNREACHABLE(); | 2332 UNREACHABLE(); |
2329 return 0; | 2333 return 0; |
2330 } | 2334 } |
2331 | 2335 |
| 2336 iterator begin() { return iterator(anchor_.next_page()); } |
| 2337 iterator end() { return iterator(anchor()); } |
| 2338 |
| 2339 std::unique_ptr<ObjectIterator> GetObjectIterator() override; |
| 2340 |
2332 #ifdef DEBUG | 2341 #ifdef DEBUG |
2333 void Print() override; | 2342 void Print() override; |
2334 // Validate a range of of addresses in a SemiSpace. | 2343 // Validate a range of of addresses in a SemiSpace. |
2335 // The "from" address must be on a page prior to the "to" address, | 2344 // The "from" address must be on a page prior to the "to" address, |
2336 // in the linked page order, or it must be earlier on the same page. | 2345 // in the linked page order, or it must be earlier on the same page. |
2337 static void AssertValidRange(Address from, Address to); | 2346 static void AssertValidRange(Address from, Address to); |
2338 #else | 2347 #else |
2339 // Do nothing. | 2348 // Do nothing. |
2340 inline static void AssertValidRange(Address from, Address to) {} | 2349 inline static void AssertValidRange(Address from, Address to) {} |
2341 #endif | 2350 #endif |
2342 | 2351 |
2343 #ifdef VERIFY_HEAP | 2352 #ifdef VERIFY_HEAP |
2344 virtual void Verify(); | 2353 virtual void Verify(); |
2345 #endif | 2354 #endif |
2346 | 2355 |
2347 iterator begin() { return iterator(anchor_.next_page()); } | |
2348 iterator end() { return iterator(anchor()); } | |
2349 | |
2350 private: | 2356 private: |
2351 void RewindPages(Page* start, int num_pages); | 2357 void RewindPages(Page* start, int num_pages); |
2352 | 2358 |
2353 inline Page* anchor() { return &anchor_; } | 2359 inline Page* anchor() { return &anchor_; } |
2354 inline int max_pages() { return current_capacity_ / Page::kPageSize; } | 2360 inline int max_pages() { return current_capacity_ / Page::kPageSize; } |
2355 | 2361 |
2356 // Copies the flags into the masked positions on all pages in the space. | 2362 // Copies the flags into the masked positions on all pages in the space. |
2357 void FixPagesFlags(intptr_t flags, intptr_t flag_mask); | 2363 void FixPagesFlags(intptr_t flags, intptr_t flag_mask); |
2358 | 2364 |
2359 // The currently committed space capacity. | 2365 // The currently committed space capacity. |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2641 bool IsFromSpaceCommitted() { return from_space_.is_committed(); } | 2647 bool IsFromSpaceCommitted() { return from_space_.is_committed(); } |
2642 | 2648 |
2643 SemiSpace* active_space() { return &to_space_; } | 2649 SemiSpace* active_space() { return &to_space_; } |
2644 | 2650 |
2645 void PauseAllocationObservers() override; | 2651 void PauseAllocationObservers() override; |
2646 void ResumeAllocationObservers() override; | 2652 void ResumeAllocationObservers() override; |
2647 | 2653 |
2648 iterator begin() { return to_space_.begin(); } | 2654 iterator begin() { return to_space_.begin(); } |
2649 iterator end() { return to_space_.end(); } | 2655 iterator end() { return to_space_.end(); } |
2650 | 2656 |
| 2657 std::unique_ptr<ObjectIterator> GetObjectIterator() override; |
| 2658 |
2651 private: | 2659 private: |
2652 // Update allocation info to match the current to-space page. | 2660 // Update allocation info to match the current to-space page. |
2653 void UpdateAllocationInfo(); | 2661 void UpdateAllocationInfo(); |
2654 | 2662 |
2655 base::Mutex mutex_; | 2663 base::Mutex mutex_; |
2656 | 2664 |
2657 // The semispaces. | 2665 // The semispaces. |
2658 SemiSpace to_space_; | 2666 SemiSpace to_space_; |
2659 SemiSpace from_space_; | 2667 SemiSpace from_space_; |
2660 base::VirtualMemory reservation_; | 2668 base::VirtualMemory reservation_; |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2856 void AdjustLiveBytes(int by) { objects_size_ += by; } | 2864 void AdjustLiveBytes(int by) { objects_size_ += by; } |
2857 | 2865 |
2858 LargePage* first_page() { return first_page_; } | 2866 LargePage* first_page() { return first_page_; } |
2859 | 2867 |
2860 // Collect code statistics. | 2868 // Collect code statistics. |
2861 void CollectCodeStatistics(); | 2869 void CollectCodeStatistics(); |
2862 | 2870 |
2863 iterator begin() { return iterator(first_page_); } | 2871 iterator begin() { return iterator(first_page_); } |
2864 iterator end() { return iterator(nullptr); } | 2872 iterator end() { return iterator(nullptr); } |
2865 | 2873 |
| 2874 std::unique_ptr<ObjectIterator> GetObjectIterator() override; |
| 2875 |
2866 #ifdef VERIFY_HEAP | 2876 #ifdef VERIFY_HEAP |
2867 virtual void Verify(); | 2877 virtual void Verify(); |
2868 #endif | 2878 #endif |
2869 | 2879 |
2870 #ifdef DEBUG | 2880 #ifdef DEBUG |
2871 void Print() override; | 2881 void Print() override; |
2872 void ReportStatistics(); | 2882 void ReportStatistics(); |
2873 #endif | 2883 #endif |
2874 | 2884 |
2875 private: | 2885 private: |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2917 PageIterator old_iterator_; | 2927 PageIterator old_iterator_; |
2918 PageIterator code_iterator_; | 2928 PageIterator code_iterator_; |
2919 PageIterator map_iterator_; | 2929 PageIterator map_iterator_; |
2920 LargePageIterator lo_iterator_; | 2930 LargePageIterator lo_iterator_; |
2921 }; | 2931 }; |
2922 | 2932 |
2923 } // namespace internal | 2933 } // namespace internal |
2924 } // namespace v8 | 2934 } // namespace v8 |
2925 | 2935 |
2926 #endif // V8_HEAP_SPACES_H_ | 2936 #endif // V8_HEAP_SPACES_H_ |
OLD | NEW |