| // 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, Isolate* isolate) { |
| isolate->store_buffer_block()->ProcessBuffer(isolate); |
| } |
| END_LEAF_RUNTIME_ENTRY |
| |
| |
| void StoreBufferBlock::ProcessBuffer() { |
| ProcessBuffer(Isolate::Current()); |
| } |
| |
| |
| void StoreBufferBlock::ProcessBuffer(Isolate* isolate) { |
| StoreBuffer* buffer = isolate->store_buffer(); |
| int32_t end = top_; |
| for (int32_t i = 0; i < end; i++) { |
| buffer->AddPointer(pointers_[i]); |
| } |
| top_ = 0; // Reset back to the beginning. |
| } |
| |
| |
| bool StoreBufferBlock::Contains(uword pointer) { |
| for (int32_t i = 0; i < top_; i++) { |
| if (pointers_[i] == pointer) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| |
| StoreBuffer::~StoreBuffer() { |
| DedupSet* current = dedup_sets_; |
| dedup_sets_ = NULL; |
| while (current != NULL) { |
| DedupSet* next = current->next(); |
| delete current; |
| current = next; |
| } |
| } |
| |
| |
| void StoreBuffer::Reset() { |
| DedupSet* current = DedupSets(); |
| while (current != NULL) { |
| DedupSet* next = current->next(); |
| delete current; |
| current = next; |
| } |
| } |
| |
| |
| void StoreBuffer::AddPointer(uword address) { |
| ASSERT(dedup_sets_ != NULL); |
| ASSERT(Isolate::Current()->heap()->OldContains(address)); |
| if (!dedup_sets_->set()->Add(address)) { |
| // Add a new DedupSet. Schedule an interrupt if we have run over the max |
| // number of DedupSets. |
| dedup_sets_ = new DedupSet(dedup_sets_); |
| count_++; |
| // TODO(iposva): Fix magic number. |
| if (count_ > 100) { |
| Isolate::Current()->ScheduleInterrupts(Isolate::kStoreBufferInterrupt); |
| } |
| } |
| } |
| |
| } // namespace dart |