| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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_SLOTS_BUFFER_H_ | 5 #ifndef V8_HEAP_SLOTS_BUFFER_H_ |
| 6 #define V8_HEAP_SLOTS_BUFFER_H_ | 6 #define V8_HEAP_SLOTS_BUFFER_H_ |
| 7 | 7 |
| 8 #include "src/objects.h" | 8 #include "src/objects.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 inline bool IsFull() { return idx_ == kNumberOfElements; } | 115 inline bool IsFull() { return idx_ == kNumberOfElements; } |
| 116 | 116 |
| 117 inline bool HasSpaceForTypedSlot() { return idx_ < kNumberOfElements - 1; } | 117 inline bool HasSpaceForTypedSlot() { return idx_ < kNumberOfElements - 1; } |
| 118 | 118 |
| 119 enum AdditionMode { FAIL_ON_OVERFLOW, IGNORE_OVERFLOW }; | 119 enum AdditionMode { FAIL_ON_OVERFLOW, IGNORE_OVERFLOW }; |
| 120 | 120 |
| 121 static bool ChainLengthThresholdReached(SlotsBuffer* buffer) { | 121 static bool ChainLengthThresholdReached(SlotsBuffer* buffer) { |
| 122 return buffer != NULL && buffer->chain_length_ >= kChainLengthThreshold; | 122 return buffer != NULL && buffer->chain_length_ >= kChainLengthThreshold; |
| 123 } | 123 } |
| 124 | 124 |
| 125 INLINE(static bool AddToSynchronized(SlotsBufferAllocator* allocator, | |
| 126 SlotsBuffer** buffer_address, | |
| 127 base::Mutex* buffer_mutex, | |
| 128 ObjectSlot slot, AdditionMode mode)) { | |
| 129 base::LockGuard<base::Mutex> lock_guard(buffer_mutex); | |
| 130 return AddTo(allocator, buffer_address, slot, mode); | |
| 131 } | |
| 132 | |
| 133 INLINE(static bool AddTo(SlotsBufferAllocator* allocator, | 125 INLINE(static bool AddTo(SlotsBufferAllocator* allocator, |
| 134 SlotsBuffer** buffer_address, ObjectSlot slot, | 126 SlotsBuffer** buffer_address, ObjectSlot slot, |
| 135 AdditionMode mode)) { | 127 AdditionMode mode)) { |
| 136 SlotsBuffer* buffer = *buffer_address; | 128 SlotsBuffer* buffer = *buffer_address; |
| 137 if (buffer == NULL || buffer->IsFull()) { | 129 if (buffer == NULL || buffer->IsFull()) { |
| 138 if (mode == FAIL_ON_OVERFLOW && ChainLengthThresholdReached(buffer)) { | 130 if (mode == FAIL_ON_OVERFLOW && ChainLengthThresholdReached(buffer)) { |
| 139 allocator->DeallocateChain(buffer_address); | 131 allocator->DeallocateChain(buffer_address); |
| 140 return false; | 132 return false; |
| 141 } | 133 } |
| 142 buffer = allocator->AllocateBuffer(buffer); | 134 buffer = allocator->AllocateBuffer(buffer); |
| 143 *buffer_address = buffer; | 135 *buffer_address = buffer; |
| 144 } | 136 } |
| 145 buffer->Add(slot); | 137 buffer->Add(slot); |
| 146 return true; | 138 return true; |
| 147 } | 139 } |
| 148 | 140 |
| 149 static bool IsTypedSlot(ObjectSlot slot); | 141 static bool IsTypedSlot(ObjectSlot slot); |
| 150 | 142 |
| 151 static bool AddToSynchronized(SlotsBufferAllocator* allocator, | |
| 152 SlotsBuffer** buffer_address, | |
| 153 base::Mutex* buffer_mutex, SlotType type, | |
| 154 Address addr, AdditionMode mode); | |
| 155 | |
| 156 static bool AddTo(SlotsBufferAllocator* allocator, | 143 static bool AddTo(SlotsBufferAllocator* allocator, |
| 157 SlotsBuffer** buffer_address, SlotType type, Address addr, | 144 SlotsBuffer** buffer_address, SlotType type, Address addr, |
| 158 AdditionMode mode); | 145 AdditionMode mode); |
| 159 | 146 |
| 160 // Eliminates all stale entries from the slots buffer, i.e., slots that | 147 // Eliminates all stale entries from the slots buffer, i.e., slots that |
| 161 // are not part of live objects anymore. This method must be called after | 148 // are not part of live objects anymore. This method must be called after |
| 162 // marking, when the whole transitive closure is known and must be called | 149 // marking, when the whole transitive closure is known and must be called |
| 163 // before sweeping when mark bits are still intact. | 150 // before sweeping when mark bits are still intact. |
| 164 static void RemoveInvalidSlots(Heap* heap, SlotsBuffer* buffer); | 151 static void RemoveInvalidSlots(Heap* heap, SlotsBuffer* buffer); |
| 165 | 152 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 179 intptr_t chain_length_; | 166 intptr_t chain_length_; |
| 180 SlotsBuffer* next_; | 167 SlotsBuffer* next_; |
| 181 ObjectSlot slots_[kNumberOfElements]; | 168 ObjectSlot slots_[kNumberOfElements]; |
| 182 }; | 169 }; |
| 183 | 170 |
| 184 | 171 |
| 185 } // namespace internal | 172 } // namespace internal |
| 186 } // namespace v8 | 173 } // namespace v8 |
| 187 | 174 |
| 188 #endif // V8_HEAP_SLOTS_BUFFER_H_ | 175 #endif // V8_HEAP_SLOTS_BUFFER_H_ |
| OLD | NEW |