| Index: runtime/vm/store_buffer.h
|
| ===================================================================
|
| --- runtime/vm/store_buffer.h (revision 22392)
|
| +++ runtime/vm/store_buffer.h (working copy)
|
| @@ -7,54 +7,41 @@
|
|
|
| #include "platform/assert.h"
|
| #include "vm/globals.h"
|
| -#include "vm/hash_set.h"
|
|
|
| namespace dart {
|
|
|
| // Forward declarations.
|
| class Isolate;
|
| +class RawObject;
|
|
|
| class StoreBufferBlock {
|
| public:
|
| // Each block contains kSize pointers.
|
| static const int32_t kSize = 1024;
|
|
|
| - StoreBufferBlock() : top_(0) {}
|
| + explicit StoreBufferBlock(StoreBufferBlock* next) : next_(next), top_(0) {}
|
|
|
| - static int top_offset() { return OFFSET_OF(StoreBufferBlock, top_); }
|
| - static int pointers_offset() {
|
| - return OFFSET_OF(StoreBufferBlock, pointers_);
|
| - }
|
| -
|
| void Reset() { top_ = 0; }
|
|
|
| + StoreBufferBlock* next() const { return next_; }
|
| +
|
| intptr_t Count() const { return top_; }
|
|
|
| - uword At(intptr_t i) const {
|
| + RawObject* At(intptr_t i) const {
|
| ASSERT(i >= 0);
|
| ASSERT(i < top_);
|
| return pointers_[i];
|
| }
|
|
|
| - // Add a pointer to the block of pointers. The buffer will be processed if it
|
| - // has been filled by this operation.
|
| - void AddPointer(uword pointer) {
|
| - ASSERT(top_ < kSize);
|
| - pointers_[top_++] = pointer;
|
| - if (top_ == kSize) {
|
| - ProcessBuffer();
|
| - }
|
| + static int top_offset() { return OFFSET_OF(StoreBufferBlock, top_); }
|
| + static int pointers_offset() {
|
| + return OFFSET_OF(StoreBufferBlock, pointers_);
|
| }
|
|
|
| - // Process this store buffer and remember its contents in the heap.
|
| - void ProcessBuffer();
|
| - void ProcessBuffer(Isolate* isolate);
|
| -
|
| - bool Contains(uword pointer);
|
| -
|
| private:
|
| + StoreBufferBlock* next_;
|
| int32_t top_;
|
| - uword pointers_[kSize];
|
| + RawObject* pointers_[kSize];
|
|
|
| friend class StoreBuffer;
|
|
|
| @@ -64,63 +51,54 @@
|
|
|
| class StoreBuffer {
|
| public:
|
| - // Simple linked list element containing a HashSet of old->new pointers.
|
| - class DedupSet {
|
| - public:
|
| - enum {
|
| - kSetSize = 1024,
|
| - kFillRatio = 75
|
| - };
|
| -
|
| - explicit DedupSet(DedupSet* next)
|
| - : next_(next), set_(new HashSet(kSetSize, kFillRatio)) {}
|
| - ~DedupSet() {
|
| - delete set_;
|
| - }
|
| -
|
| - DedupSet* next() const { return next_; }
|
| - HashSet* set() const { return set_; }
|
| -
|
| - private:
|
| - DedupSet* next_;
|
| - HashSet* set_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DedupSet);
|
| - };
|
| -
|
| - StoreBuffer() : dedup_sets_(new DedupSet(NULL)), count_(1) {}
|
| + StoreBuffer() : blocks_(new StoreBufferBlock(NULL)), full_count_(0) {}
|
| ~StoreBuffer();
|
|
|
| + intptr_t Count() const {
|
| + return blocks_->Count() + (full_count_ * StoreBufferBlock::kSize);
|
| + }
|
| +
|
| void Reset();
|
|
|
| - void AddPointer(uword address);
|
| + void AddObject(RawObject* obj) {
|
| + StoreBufferBlock* block = blocks_;
|
| + ASSERT(block->top_ < StoreBufferBlock::kSize);
|
| + block->pointers_[block->top_++] = obj;
|
| + if (block->top_ == StoreBufferBlock::kSize) {
|
| + Expand(true);
|
| + }
|
| + }
|
|
|
| - // Drain StoreBufferBlock into deduplication sets.
|
| - // Returns true if new sets were created.
|
| - bool DrainBlock(StoreBufferBlock* block);
|
| + void AddObjectGC(RawObject* obj) {
|
| + StoreBufferBlock* block = blocks_;
|
| + ASSERT(block->top_ < StoreBufferBlock::kSize);
|
| + block->pointers_[block->top_++] = obj;
|
| + if (block->top_ == StoreBufferBlock::kSize) {
|
| + Expand(false);
|
| + }
|
| + }
|
|
|
| - // Drain StoreBufferBlock into deduplication sets.
|
| - // Schedule an interrupt if we run over the max number of deduplication sets.
|
| - void ProcessBlock(StoreBufferBlock* block);
|
| -
|
| - DedupSet* DedupSets() {
|
| - DedupSet* result = dedup_sets_;
|
| - dedup_sets_ = new DedupSet(NULL);
|
| - count_ = 1;
|
| + StoreBufferBlock* Blocks() {
|
| + StoreBufferBlock* result = blocks_;
|
| + blocks_ = new StoreBufferBlock(NULL);
|
| + full_count_ = 0;
|
| return result;
|
| }
|
|
|
| - private:
|
| - // Add pointer to deduplication sets. Returns true if the current set is full
|
| - // and a new set was created.
|
| - bool AddPointerInternal(uword address);
|
| + // Expand the storage and optionally check whethe to schedule an interrupt.
|
| + void Expand(bool check);
|
|
|
| + bool Contains(RawObject* raw);
|
| +
|
| + static int blocks_offset() { return OFFSET_OF(StoreBuffer, blocks_); }
|
| +
|
| + private:
|
| // Check if we run over the max number of deduplication sets.
|
| // If we did schedule an interrupt.
|
| void CheckThreshold();
|
|
|
| - DedupSet* dedup_sets_;
|
| - intptr_t count_;
|
| + StoreBufferBlock* blocks_;
|
| + intptr_t full_count_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(StoreBuffer);
|
| };
|
|
|