| 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_STORE_BUFFER_INL_H_ |   5 #ifndef V8_STORE_BUFFER_INL_H_ | 
|   6 #define V8_STORE_BUFFER_INL_H_ |   6 #define V8_STORE_BUFFER_INL_H_ | 
|   7  |   7  | 
|   8 #include "src/heap/heap.h" |   8 #include "src/heap/heap.h" | 
|   9 #include "src/heap/spaces-inl.h" |   9 #include "src/heap/spaces-inl.h" | 
|  10 #include "src/heap/store-buffer.h" |  10 #include "src/heap/store-buffer.h" | 
|  11  |  11  | 
|  12 namespace v8 { |  12 namespace v8 { | 
|  13 namespace internal { |  13 namespace internal { | 
|  14  |  14  | 
|  15 void StoreBuffer::Mark(Address addr) { |  15 void StoreBuffer::Mark(Address addr) { | 
|  16   DCHECK(!heap_->code_space()->Contains(addr)); |  16   DCHECK(!heap_->code_space()->Contains(addr)); | 
|  17   Address* top = reinterpret_cast<Address*>(heap_->store_buffer_top()); |  17   Address* top = reinterpret_cast<Address*>(heap_->store_buffer_top()); | 
|  18   *top++ = addr; |  18   *top++ = addr; | 
|  19   heap_->set_store_buffer_top(reinterpret_cast<Smi*>(top)); |  19   heap_->set_store_buffer_top(reinterpret_cast<Smi*>(top)); | 
|  20   if ((reinterpret_cast<uintptr_t>(top) & kStoreBufferOverflowBit) != 0) { |  20   if ((reinterpret_cast<uintptr_t>(top) & kStoreBufferOverflowBit) != 0) { | 
|  21     DCHECK(top == limit_); |  21     DCHECK(top == limit_); | 
|  22     Compact(); |  22     Compact(); | 
|  23   } else { |  23   } else { | 
|  24     DCHECK(top < limit_); |  24     DCHECK(top < limit_); | 
|  25   } |  25   } | 
|  26 } |  26 } | 
|  27  |  27  | 
|  28  |  28  | 
|  29 inline void StoreBuffer::MarkSynchronized(Address addr) { |  | 
|  30   base::LockGuard<base::Mutex> lock_guard(&mutex_); |  | 
|  31   Mark(addr); |  | 
|  32 } |  | 
|  33  |  | 
|  34  |  | 
|  35 void StoreBuffer::EnterDirectlyIntoStoreBuffer(Address addr) { |  29 void StoreBuffer::EnterDirectlyIntoStoreBuffer(Address addr) { | 
|  36   if (store_buffer_rebuilding_enabled_) { |  30   if (store_buffer_rebuilding_enabled_) { | 
|  37     SLOW_DCHECK(!heap_->code_space()->Contains(addr) && |  31     SLOW_DCHECK(!heap_->code_space()->Contains(addr) && | 
|  38                 !heap_->new_space()->Contains(addr)); |  32                 !heap_->new_space()->Contains(addr)); | 
|  39     Address* top = old_top_; |  33     Address* top = old_top_; | 
|  40     *top++ = addr; |  34     *top++ = addr; | 
|  41     old_top_ = top; |  35     old_top_ = top; | 
|  42     old_buffer_is_sorted_ = false; |  36     old_buffer_is_sorted_ = false; | 
|  43     old_buffer_is_filtered_ = false; |  37     old_buffer_is_filtered_ = false; | 
|  44     if (top >= old_limit_) { |  38     if (top >= old_limit_) { | 
|  45       DCHECK(callback_ != NULL); |  39       DCHECK(callback_ != NULL); | 
|  46       (*callback_)(heap_, MemoryChunk::FromAnyPointerAddress(heap_, addr), |  40       (*callback_)(heap_, MemoryChunk::FromAnyPointerAddress(heap_, addr), | 
|  47                    kStoreBufferFullEvent); |  41                    kStoreBufferFullEvent); | 
|  48     } |  42     } | 
|  49   } |  43   } | 
|  50 } |  44 } | 
 |  45  | 
 |  46 void LocalStoreBuffer::Record(Address addr) { | 
 |  47   if (top_->is_full()) top_ = new Node(top_); | 
 |  48   top_->buffer[top_->count++] = addr; | 
 |  49 } | 
 |  50  | 
 |  51 void LocalStoreBuffer::Process(StoreBuffer* store_buffer) { | 
 |  52   Node* current = top_; | 
 |  53   while (current != nullptr) { | 
 |  54     for (int i = 0; i < current->count; i++) { | 
 |  55       store_buffer->Mark(current->buffer[i]); | 
 |  56     } | 
 |  57     current = current->next; | 
 |  58   } | 
 |  59 } | 
 |  60  | 
|  51 }  // namespace internal |  61 }  // namespace internal | 
|  52 }  // namespace v8 |  62 }  // namespace v8 | 
|  53  |  63  | 
|  54 #endif  // V8_STORE_BUFFER_INL_H_ |  64 #endif  // V8_STORE_BUFFER_INL_H_ | 
| OLD | NEW |