| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "vm/store_buffer.h" |
| |
| #include "platform/assert.h" |
| #include "vm/runtime_entry.h" |
| |
| namespace dart { |
| |
| DEFINE_LEAF_RUNTIME_ENTRY(void, StoreBufferBlockProcess, 1, Isolate* isolate) { |
| StoreBuffer* buffer = isolate->store_buffer(); |
| buffer->Expand(true); |
| } |
| END_LEAF_RUNTIME_ENTRY |
| |
| |
| StoreBuffer::~StoreBuffer() { |
| StoreBufferBlock* block = blocks_; |
| blocks_ = NULL; |
| while (block != NULL) { |
| StoreBufferBlock* next = block->next(); |
| delete block; |
| block = next; |
| } |
| } |
| |
| |
| void StoreBuffer::Reset() { |
| StoreBufferBlock* block = blocks_->next_; |
| while (block != NULL) { |
| StoreBufferBlock* next = block->next_; |
| delete block; |
| block = next; |
| } |
| blocks_->next_ = NULL; |
| blocks_->top_ = 0; |
| full_count_ = 0; |
| } |
| |
| |
| bool StoreBuffer::Contains(RawObject* raw) { |
| StoreBufferBlock* block = blocks_; |
| while (block != NULL) { |
| intptr_t count = block->Count(); |
| for (intptr_t i = 0; i < count; i++) { |
| if (block->At(i) == raw) { |
| return true; |
| } |
| } |
| block = block->next_; |
| } |
| return false; |
| } |
| |
| |
| void StoreBuffer::Expand(bool check) { |
| ASSERT(blocks_->Count() == StoreBufferBlock::kSize); |
| blocks_ = new StoreBufferBlock(blocks_); |
| full_count_++; |
| if (check) { |
| CheckThreshold(); |
| } |
| } |
| |
| |
| void StoreBuffer::CheckThreshold() { |
| // Schedule an interrupt if we have run over the max number of |
| // StoreBufferBlocks. |
| // TODO(iposva): Fix magic number. |
| if (full_count_ > 100) { |
| Isolate::Current()->ScheduleInterrupts(Isolate::kStoreBufferInterrupt); |
| } |
| } |
| |
| } // namespace dart |