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 3// found in the LICENSE file. 4 5#ifndef V8_STORE_BUFFER_INL_H_ 6#define V8_STORE_BUFFER_INL_H_ 7 8#include "src/heap/heap.h" 9#include "src/heap/spaces-inl.h" 10#include "src/heap/store-buffer.h" 11 12namespace v8 { 13namespace internal { 14 15void StoreBuffer::Mark(Address addr) { 16 DCHECK(!heap_->code_space()->Contains(addr)); 17 Address* top = reinterpret_cast<Address*>(heap_->store_buffer_top()); 18 *top++ = addr; 19 heap_->set_store_buffer_top(reinterpret_cast<Smi*>(top)); 20 if ((reinterpret_cast<uintptr_t>(top) & kStoreBufferOverflowBit) != 0) { 21 DCHECK(top == limit_); 22 Compact(); 23 } else { 24 DCHECK(top < limit_); 25 } 26} 27 28 29inline void StoreBuffer::MarkSynchronized(Address addr) { 30 base::LockGuard<base::Mutex> lock_guard(&mutex_); 31 Mark(addr); 32} 33 34 35void StoreBuffer::EnterDirectlyIntoStoreBuffer(Address addr) { 36 if (store_buffer_rebuilding_enabled_) { 37 SLOW_DCHECK(!heap_->code_space()->Contains(addr) && 38 !heap_->new_space()->Contains(addr)); 39 Address* top = old_top_; 40 *top++ = addr; 41 old_top_ = top; 42 old_buffer_is_sorted_ = false; 43 old_buffer_is_filtered_ = false; 44 if (top >= old_limit_) { 45 DCHECK(callback_ != NULL); 46 (*callback_)(heap_, MemoryChunk::FromAnyPointerAddress(heap_, addr), 47 kStoreBufferFullEvent); 48 } 49 } 50} 51} // namespace internal 52} // namespace v8 53 54#endif // V8_STORE_BUFFER_INL_H_ 55