| 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 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1193 starts_[idx] = reinterpret_cast<Address>(-1); | 1193 starts_[idx] = reinterpret_cast<Address>(-1); |
| 1194 } | 1194 } |
| 1195 } | 1195 } |
| 1196 | 1196 |
| 1197 Address StartFor(Address addr) { return starts_[RegionNumber(addr)]; } | 1197 Address StartFor(Address addr) { return starts_[RegionNumber(addr)]; } |
| 1198 | 1198 |
| 1199 void AddObject(Address addr, int size) { | 1199 void AddObject(Address addr, int size) { |
| 1200 int start_region = RegionNumber(addr); | 1200 int start_region = RegionNumber(addr); |
| 1201 int end_region = RegionNumber(addr + size - kPointerSize); | 1201 int end_region = RegionNumber(addr + size - kPointerSize); |
| 1202 for (int idx = start_region; idx <= end_region; idx++) { | 1202 for (int idx = start_region; idx <= end_region; idx++) { |
| 1203 if (starts_[idx] > addr) starts_[idx] = addr; | 1203 if (starts_[idx] > addr) { |
| 1204 starts_[idx] = addr; |
| 1205 } else { |
| 1206 // In the first region, there may already be an object closer to the |
| 1207 // start of the region. Do not change the start in that case. If this |
| 1208 // is not the first region, you probably added overlapping objects. |
| 1209 DCHECK_EQ(start_region, idx); |
| 1210 } |
| 1204 } | 1211 } |
| 1205 } | 1212 } |
| 1206 | 1213 |
| 1207 static inline int RegionNumber(Address addr) { | 1214 static inline int RegionNumber(Address addr) { |
| 1208 return (OffsetFrom(addr) & Page::kPageAlignmentMask) >> kRegionSizeLog2; | 1215 return (OffsetFrom(addr) & Page::kPageAlignmentMask) >> kRegionSizeLog2; |
| 1209 } | 1216 } |
| 1210 | 1217 |
| 1211 static void Update(Address addr, int size) { | 1218 static void Update(Address addr, int size) { |
| 1212 Page* page = Page::FromAddress(addr); | 1219 Page* page = Page::FromAddress(addr); |
| 1213 SkipList* list = page->skip_list(); | 1220 SkipList* list = page->skip_list(); |
| (...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2031 Address limit() { return allocation_info_.limit(); } | 2038 Address limit() { return allocation_info_.limit(); } |
| 2032 | 2039 |
| 2033 // The allocation top address. | 2040 // The allocation top address. |
| 2034 Address* allocation_top_address() { return allocation_info_.top_address(); } | 2041 Address* allocation_top_address() { return allocation_info_.top_address(); } |
| 2035 | 2042 |
| 2036 // The allocation limit address. | 2043 // The allocation limit address. |
| 2037 Address* allocation_limit_address() { | 2044 Address* allocation_limit_address() { |
| 2038 return allocation_info_.limit_address(); | 2045 return allocation_info_.limit_address(); |
| 2039 } | 2046 } |
| 2040 | 2047 |
| 2048 enum UpdateSkipList { UPDATE_SKIP_LIST, IGNORE_SKIP_LIST }; |
| 2049 |
| 2041 // Allocate the requested number of bytes in the space if possible, return a | 2050 // Allocate the requested number of bytes in the space if possible, return a |
| 2042 // failure object if not. | 2051 // failure object if not. Only use IGNORE_SKIP_LIST if the skip list is going |
| 2052 // to be manually updated later. |
| 2043 MUST_USE_RESULT inline AllocationResult AllocateRawUnaligned( | 2053 MUST_USE_RESULT inline AllocationResult AllocateRawUnaligned( |
| 2044 int size_in_bytes); | 2054 int size_in_bytes, UpdateSkipList update_skip_list = UPDATE_SKIP_LIST); |
| 2045 | 2055 |
| 2046 MUST_USE_RESULT inline AllocationResult AllocateRawUnalignedSynchronized( | 2056 MUST_USE_RESULT inline AllocationResult AllocateRawUnalignedSynchronized( |
| 2047 int size_in_bytes); | 2057 int size_in_bytes); |
| 2048 | 2058 |
| 2049 // Allocate the requested number of bytes in the space double aligned if | 2059 // Allocate the requested number of bytes in the space double aligned if |
| 2050 // possible, return a failure object if not. | 2060 // possible, return a failure object if not. |
| 2051 MUST_USE_RESULT inline AllocationResult AllocateRawAligned( | 2061 MUST_USE_RESULT inline AllocationResult AllocateRawAligned( |
| 2052 int size_in_bytes, AllocationAlignment alignment); | 2062 int size_in_bytes, AllocationAlignment alignment); |
| 2053 | 2063 |
| 2054 // Allocate the requested number of bytes in the space and consider allocation | 2064 // Allocate the requested number of bytes in the space and consider allocation |
| (...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3082 count = 0; | 3092 count = 0; |
| 3083 } | 3093 } |
| 3084 // Must be small, since an iteration is used for lookup. | 3094 // Must be small, since an iteration is used for lookup. |
| 3085 static const int kMaxComments = 64; | 3095 static const int kMaxComments = 64; |
| 3086 }; | 3096 }; |
| 3087 #endif | 3097 #endif |
| 3088 } // namespace internal | 3098 } // namespace internal |
| 3089 } // namespace v8 | 3099 } // namespace v8 |
| 3090 | 3100 |
| 3091 #endif // V8_HEAP_SPACES_H_ | 3101 #endif // V8_HEAP_SPACES_H_ |
| OLD | NEW |