| 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 "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/atomic-utils.h" | 9 #include "src/atomic-utils.h" |
| 10 #include "src/base/atomicops.h" | 10 #include "src/base/atomicops.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 | 77 |
| 78 // Some assertion macros used in the debugging mode. | 78 // Some assertion macros used in the debugging mode. |
| 79 | 79 |
| 80 #define DCHECK_PAGE_ALIGNED(address) \ | 80 #define DCHECK_PAGE_ALIGNED(address) \ |
| 81 DCHECK((OffsetFrom(address) & Page::kPageAlignmentMask) == 0) | 81 DCHECK((OffsetFrom(address) & Page::kPageAlignmentMask) == 0) |
| 82 | 82 |
| 83 #define DCHECK_OBJECT_ALIGNED(address) \ | 83 #define DCHECK_OBJECT_ALIGNED(address) \ |
| 84 DCHECK((OffsetFrom(address) & kObjectAlignmentMask) == 0) | 84 DCHECK((OffsetFrom(address) & kObjectAlignmentMask) == 0) |
| 85 | 85 |
| 86 #define DCHECK_OBJECT_SIZE(size) \ | 86 #define DCHECK_OBJECT_SIZE(size) \ |
| 87 DCHECK((0 < size) && (size <= Page::kMaxRegularHeapObjectSize)) | 87 DCHECK((0 < size) && (size <= Page::kAllocatableMemory)) |
| 88 | 88 |
| 89 #define DCHECK_PAGE_OFFSET(offset) \ | 89 #define DCHECK_PAGE_OFFSET(offset) \ |
| 90 DCHECK((Page::kObjectStartOffset <= offset) && (offset <= Page::kPageSize)) | 90 DCHECK((Page::kObjectStartOffset <= offset) && (offset <= Page::kPageSize)) |
| 91 | 91 |
| 92 #define DCHECK_MAP_PAGE_INDEX(index) \ | 92 #define DCHECK_MAP_PAGE_INDEX(index) \ |
| 93 DCHECK((0 <= index) && (index <= MapSpace::kMaxMapPageIndex)) | 93 DCHECK((0 <= index) && (index <= MapSpace::kMaxMapPageIndex)) |
| 94 | 94 |
| 95 class AllocationInfo; | 95 class AllocationInfo; |
| 96 class CompactionSpace; | 96 class CompactionSpace; |
| 97 class FreeList; | 97 class FreeList; |
| (...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 Address OffsetToAddress(int offset) { | 804 Address OffsetToAddress(int offset) { |
| 805 DCHECK_PAGE_OFFSET(offset); | 805 DCHECK_PAGE_OFFSET(offset); |
| 806 return address() + offset; | 806 return address() + offset; |
| 807 } | 807 } |
| 808 | 808 |
| 809 // --------------------------------------------------------------------- | 809 // --------------------------------------------------------------------- |
| 810 | 810 |
| 811 // Page size in bytes. This must be a multiple of the OS page size. | 811 // Page size in bytes. This must be a multiple of the OS page size. |
| 812 static const int kPageSize = 1 << kPageSizeBits; | 812 static const int kPageSize = 1 << kPageSizeBits; |
| 813 | 813 |
| 814 // Maximum object size that fits in a page. Objects larger than that size | 814 // Maximum object size that gets allocated into regular pages. Objects larger |
| 815 // are allocated in large object space and are never moved in memory. This | 815 // than that size are allocated in large object space and are never moved in |
| 816 // also applies to new space allocation, since objects are never migrated | 816 // memory. This also applies to new space allocation, since objects are never |
| 817 // from new space to large object space. Takes double alignment into account. | 817 // migrated from new space to large object space. Takes double alignment into |
| 818 // account. |
| 818 static const int kMaxRegularHeapObjectSize = kPageSize - kObjectStartOffset; | 819 static const int kMaxRegularHeapObjectSize = kPageSize - kObjectStartOffset; |
| 819 | 820 |
| 821 static const int kAllocatableMemory = kPageSize - kObjectStartOffset; |
| 822 |
| 820 // Page size mask. | 823 // Page size mask. |
| 821 static const intptr_t kPageAlignmentMask = (1 << kPageSizeBits) - 1; | 824 static const intptr_t kPageAlignmentMask = (1 << kPageSizeBits) - 1; |
| 822 | 825 |
| 823 inline void ClearGCFields(); | 826 inline void ClearGCFields(); |
| 824 | 827 |
| 825 static inline Page* Initialize(Heap* heap, MemoryChunk* chunk, | 828 static inline Page* Initialize(Heap* heap, MemoryChunk* chunk, |
| 826 Executability executable, PagedSpace* owner); | 829 Executability executable, PagedSpace* owner); |
| 827 | 830 |
| 828 void InitializeAsAnchor(PagedSpace* owner); | 831 void InitializeAsAnchor(PagedSpace* owner); |
| 829 | 832 |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1140 | 1143 |
| 1141 // Returns the maximum available executable bytes of heaps. | 1144 // Returns the maximum available executable bytes of heaps. |
| 1142 intptr_t AvailableExecutable() { | 1145 intptr_t AvailableExecutable() { |
| 1143 intptr_t executable_size = SizeExecutable(); | 1146 intptr_t executable_size = SizeExecutable(); |
| 1144 if (capacity_executable_ < executable_size) return 0; | 1147 if (capacity_executable_ < executable_size) return 0; |
| 1145 return capacity_executable_ - executable_size; | 1148 return capacity_executable_ - executable_size; |
| 1146 } | 1149 } |
| 1147 | 1150 |
| 1148 // Returns maximum available bytes that the old space can have. | 1151 // Returns maximum available bytes that the old space can have. |
| 1149 intptr_t MaxAvailable() { | 1152 intptr_t MaxAvailable() { |
| 1150 return (Available() / Page::kPageSize) * Page::kMaxRegularHeapObjectSize; | 1153 return (Available() / Page::kPageSize) * Page::kAllocatableMemory; |
| 1151 } | 1154 } |
| 1152 | 1155 |
| 1153 // Returns an indication of whether a pointer is in a space that has | 1156 // Returns an indication of whether a pointer is in a space that has |
| 1154 // been allocated by this MemoryAllocator. | 1157 // been allocated by this MemoryAllocator. |
| 1155 V8_INLINE bool IsOutsideAllocatedSpace(const void* address) { | 1158 V8_INLINE bool IsOutsideAllocatedSpace(const void* address) { |
| 1156 return address < lowest_ever_allocated_.Value() || | 1159 return address < lowest_ever_allocated_.Value() || |
| 1157 address >= highest_ever_allocated_.Value(); | 1160 address >= highest_ever_allocated_.Value(); |
| 1158 } | 1161 } |
| 1159 | 1162 |
| 1160 #ifdef DEBUG | 1163 #ifdef DEBUG |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1216 | 1219 |
| 1217 static int CodePageAreaEndOffset(); | 1220 static int CodePageAreaEndOffset(); |
| 1218 | 1221 |
| 1219 static int CodePageAreaSize() { | 1222 static int CodePageAreaSize() { |
| 1220 return CodePageAreaEndOffset() - CodePageAreaStartOffset(); | 1223 return CodePageAreaEndOffset() - CodePageAreaStartOffset(); |
| 1221 } | 1224 } |
| 1222 | 1225 |
| 1223 static int PageAreaSize(AllocationSpace space) { | 1226 static int PageAreaSize(AllocationSpace space) { |
| 1224 DCHECK_NE(LO_SPACE, space); | 1227 DCHECK_NE(LO_SPACE, space); |
| 1225 return (space == CODE_SPACE) ? CodePageAreaSize() | 1228 return (space == CODE_SPACE) ? CodePageAreaSize() |
| 1226 : Page::kMaxRegularHeapObjectSize; | 1229 : Page::kAllocatableMemory; |
| 1227 } | 1230 } |
| 1228 | 1231 |
| 1229 MUST_USE_RESULT bool CommitExecutableMemory(base::VirtualMemory* vm, | 1232 MUST_USE_RESULT bool CommitExecutableMemory(base::VirtualMemory* vm, |
| 1230 Address start, size_t commit_size, | 1233 Address start, size_t commit_size, |
| 1231 size_t reserved_size); | 1234 size_t reserved_size); |
| 1232 | 1235 |
| 1233 private: | 1236 private: |
| 1234 Isolate* isolate_; | 1237 Isolate* isolate_; |
| 1235 | 1238 |
| 1236 // Maximum space size in bytes. | 1239 // Maximum space size in bytes. |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1677 FreeListCategory* small_list() { return &small_list_; } | 1680 FreeListCategory* small_list() { return &small_list_; } |
| 1678 FreeListCategory* medium_list() { return &medium_list_; } | 1681 FreeListCategory* medium_list() { return &medium_list_; } |
| 1679 FreeListCategory* large_list() { return &large_list_; } | 1682 FreeListCategory* large_list() { return &large_list_; } |
| 1680 FreeListCategory* huge_list() { return &huge_list_; } | 1683 FreeListCategory* huge_list() { return &huge_list_; } |
| 1681 | 1684 |
| 1682 PagedSpace* owner() { return owner_; } | 1685 PagedSpace* owner() { return owner_; } |
| 1683 | 1686 |
| 1684 private: | 1687 private: |
| 1685 // The size range of blocks, in bytes. | 1688 // The size range of blocks, in bytes. |
| 1686 static const int kMinBlockSize = 3 * kPointerSize; | 1689 static const int kMinBlockSize = 3 * kPointerSize; |
| 1687 static const int kMaxBlockSize = Page::kMaxRegularHeapObjectSize; | 1690 static const int kMaxBlockSize = Page::kAllocatableMemory; |
| 1688 | 1691 |
| 1689 static const int kSmallListMin = 0x1f * kPointerSize; | 1692 static const int kSmallListMin = 0x1f * kPointerSize; |
| 1690 static const int kSmallListMax = 0xff * kPointerSize; | 1693 static const int kSmallListMax = 0xff * kPointerSize; |
| 1691 static const int kMediumListMax = 0x7ff * kPointerSize; | 1694 static const int kMediumListMax = 0x7ff * kPointerSize; |
| 1692 static const int kLargeListMax = 0x3fff * kPointerSize; | 1695 static const int kLargeListMax = 0x3fff * kPointerSize; |
| 1693 static const int kSmallAllocationMax = kSmallListMin; | 1696 static const int kSmallAllocationMax = kSmallListMin; |
| 1694 static const int kMediumAllocationMax = kSmallListMax; | 1697 static const int kMediumAllocationMax = kSmallListMax; |
| 1695 static const int kLargeAllocationMax = kMediumListMax; | 1698 static const int kLargeAllocationMax = kMediumListMax; |
| 1696 | 1699 |
| 1697 FreeSpace* FindNodeFor(int size_in_bytes, int* node_size); | 1700 FreeSpace* FindNodeFor(int size_in_bytes, int* node_size); |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2096 | 2099 |
| 2097 class NewSpacePage : public MemoryChunk { | 2100 class NewSpacePage : public MemoryChunk { |
| 2098 public: | 2101 public: |
| 2099 // GC related flags copied from from-space to to-space when | 2102 // GC related flags copied from from-space to to-space when |
| 2100 // flipping semispaces. | 2103 // flipping semispaces. |
| 2101 static const intptr_t kCopyOnFlipFlagsMask = | 2104 static const intptr_t kCopyOnFlipFlagsMask = |
| 2102 (1 << MemoryChunk::POINTERS_TO_HERE_ARE_INTERESTING) | | 2105 (1 << MemoryChunk::POINTERS_TO_HERE_ARE_INTERESTING) | |
| 2103 (1 << MemoryChunk::POINTERS_FROM_HERE_ARE_INTERESTING) | | 2106 (1 << MemoryChunk::POINTERS_FROM_HERE_ARE_INTERESTING) | |
| 2104 (1 << MemoryChunk::SCAN_ON_SCAVENGE); | 2107 (1 << MemoryChunk::SCAN_ON_SCAVENGE); |
| 2105 | 2108 |
| 2106 static const int kAreaSize = Page::kMaxRegularHeapObjectSize; | 2109 static const int kAreaSize = Page::kAllocatableMemory; |
| 2107 | 2110 |
| 2108 inline NewSpacePage* next_page() { | 2111 inline NewSpacePage* next_page() { |
| 2109 return static_cast<NewSpacePage*>(next_chunk()); | 2112 return static_cast<NewSpacePage*>(next_chunk()); |
| 2110 } | 2113 } |
| 2111 | 2114 |
| 2112 inline void set_next_page(NewSpacePage* page) { set_next_chunk(page); } | 2115 inline void set_next_page(NewSpacePage* page) { set_next_chunk(page); } |
| 2113 | 2116 |
| 2114 inline NewSpacePage* prev_page() { | 2117 inline NewSpacePage* prev_page() { |
| 2115 return static_cast<NewSpacePage*>(prev_chunk()); | 2118 return static_cast<NewSpacePage*>(prev_chunk()); |
| 2116 } | 2119 } |
| (...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2815 return RoundDown(size, Map::kSize); | 2818 return RoundDown(size, Map::kSize); |
| 2816 } else { | 2819 } else { |
| 2817 return (size / Map::kSize) * Map::kSize; | 2820 return (size / Map::kSize) * Map::kSize; |
| 2818 } | 2821 } |
| 2819 } | 2822 } |
| 2820 | 2823 |
| 2821 protected: | 2824 protected: |
| 2822 virtual void VerifyObject(HeapObject* obj); | 2825 virtual void VerifyObject(HeapObject* obj); |
| 2823 | 2826 |
| 2824 private: | 2827 private: |
| 2825 static const int kMapsPerPage = Page::kMaxRegularHeapObjectSize / Map::kSize; | 2828 static const int kMapsPerPage = Page::kAllocatableMemory / Map::kSize; |
| 2826 | 2829 |
| 2827 // Do map space compaction if there is a page gap. | 2830 // Do map space compaction if there is a page gap. |
| 2828 int CompactionThreshold() { | 2831 int CompactionThreshold() { |
| 2829 return kMapsPerPage * (max_map_space_pages_ - 1); | 2832 return kMapsPerPage * (max_map_space_pages_ - 1); |
| 2830 } | 2833 } |
| 2831 | 2834 |
| 2832 const int max_map_space_pages_; | 2835 const int max_map_space_pages_; |
| 2833 }; | 2836 }; |
| 2834 | 2837 |
| 2835 | 2838 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2970 count = 0; | 2973 count = 0; |
| 2971 } | 2974 } |
| 2972 // Must be small, since an iteration is used for lookup. | 2975 // Must be small, since an iteration is used for lookup. |
| 2973 static const int kMaxComments = 64; | 2976 static const int kMaxComments = 64; |
| 2974 }; | 2977 }; |
| 2975 #endif | 2978 #endif |
| 2976 } | 2979 } |
| 2977 } // namespace v8::internal | 2980 } // namespace v8::internal |
| 2978 | 2981 |
| 2979 #endif // V8_HEAP_SPACES_H_ | 2982 #endif // V8_HEAP_SPACES_H_ |
| OLD | NEW |