Index: runtime/vm/store_buffer.cc |
=================================================================== |
--- runtime/vm/store_buffer.cc (revision 22392) |
+++ runtime/vm/store_buffer.cc (working copy) |
@@ -10,98 +10,68 @@ |
namespace dart { |
DEFINE_LEAF_RUNTIME_ENTRY(void, StoreBufferBlockProcess, Isolate* isolate) { |
- isolate->store_buffer_block()->ProcessBuffer(isolate); |
+ StoreBuffer* buffer = isolate->store_buffer(); |
+ buffer->Expand(true); |
} |
END_LEAF_RUNTIME_ENTRY |
-void StoreBufferBlock::ProcessBuffer() { |
- ProcessBuffer(Isolate::Current()); |
-} |
- |
- |
-void StoreBufferBlock::ProcessBuffer(Isolate* isolate) { |
- isolate->store_buffer()->ProcessBlock(this); |
-} |
- |
- |
-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; |
+ StoreBufferBlock* block = blocks_; |
+ blocks_ = NULL; |
+ while (block != NULL) { |
+ StoreBufferBlock* next = block->next(); |
+ delete block; |
+ block = next; |
} |
} |
void StoreBuffer::Reset() { |
- DedupSet* current = DedupSets(); |
- while (current != NULL) { |
- DedupSet* next = current->next(); |
- delete current; |
- current = next; |
+ 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::AddPointerInternal(uword address) { |
- ASSERT(dedup_sets_ != NULL); |
- ASSERT(Isolate::Current()->heap()->OldContains(address)); |
- ASSERT((address & kSmiTagMask) != kSmiTag); |
- if (!dedup_sets_->set()->Add(address)) { |
- // Add a new DedupSet. |
- dedup_sets_ = new DedupSet(dedup_sets_); |
- count_++; |
- return true; |
+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::AddPointer(uword address) { |
- if (AddPointerInternal(address)) { |
- // Had to create a new DedupSet. |
+void StoreBuffer::Expand(bool check) { |
+ ASSERT(blocks_->Count() == StoreBufferBlock::kSize); |
+ blocks_ = new StoreBufferBlock(blocks_); |
+ full_count_++; |
+ if (check) { |
CheckThreshold(); |
} |
} |
-bool StoreBuffer::DrainBlock(StoreBufferBlock* block) { |
- const intptr_t old_count = count_; |
- intptr_t entries = block->Count(); |
- for (intptr_t i = 0; i < entries; i++) { |
- AddPointerInternal(block->At(i)); |
- } |
- block->Reset(); |
- return (count_ > old_count); |
-} |
- |
- |
void StoreBuffer::CheckThreshold() { |
- // Schedule an interrupt if we have run over the max number of DedupSets. |
+ // Schedule an interrupt if we have run over the max number of |
+ // StoreBufferBlocks. |
// TODO(iposva): Fix magic number. |
- if (count_ > 100) { |
+ if (full_count_ > 100) { |
Isolate::Current()->ScheduleInterrupts(Isolate::kStoreBufferInterrupt); |
} |
} |
- |
-void StoreBuffer::ProcessBlock(StoreBufferBlock* block) { |
- if (DrainBlock(block)) { |
- CheckThreshold(); |
- } |
-} |
- |
} // namespace dart |