| Index: src/heap/mark-compact.h
|
| diff --git a/src/heap/mark-compact.h b/src/heap/mark-compact.h
|
| index 22bb8f1f597718f2eb78a93bf28ff2d20f5dfddf..2f580b6bbe366d3db92e8ee013662cccfa08e083 100644
|
| --- a/src/heap/mark-compact.h
|
| +++ b/src/heap/mark-compact.h
|
| @@ -158,6 +158,8 @@ class Marking : public AllStatic {
|
|
|
| // Returns true if the transferred color is black.
|
| INLINE(static bool TransferColor(HeapObject* from, HeapObject* to)) {
|
| + if (Page::FromAddress(to->address())->IsFlagSet(Page::BLACK_PAGE))
|
| + return true;
|
| MarkBit from_mark_bit = MarkBitFrom(from);
|
| MarkBit to_mark_bit = MarkBitFrom(to);
|
| DCHECK(Marking::IsWhite(to_mark_bit));
|
| @@ -316,6 +318,85 @@ class CodeFlusher {
|
| // Defined in isolate.h.
|
| class ThreadLocalTop;
|
|
|
| +class MarkBitCellIterator BASE_EMBEDDED {
|
| + public:
|
| + explicit MarkBitCellIterator(MemoryChunk* chunk) : chunk_(chunk) {
|
| + last_cell_index_ = Bitmap::IndexToCell(Bitmap::CellAlignIndex(
|
| + chunk_->AddressToMarkbitIndex(chunk_->area_end())));
|
| + cell_base_ = chunk_->area_start();
|
| + cell_index_ = Bitmap::IndexToCell(
|
| + Bitmap::CellAlignIndex(chunk_->AddressToMarkbitIndex(cell_base_)));
|
| + cells_ = chunk_->markbits()->cells();
|
| + }
|
| +
|
| + inline bool Done() { return cell_index_ == last_cell_index_; }
|
| +
|
| + inline bool HasNext() { return cell_index_ < last_cell_index_ - 1; }
|
| +
|
| + inline MarkBit::CellType* CurrentCell() {
|
| + DCHECK(cell_index_ == Bitmap::IndexToCell(Bitmap::CellAlignIndex(
|
| + chunk_->AddressToMarkbitIndex(cell_base_))));
|
| + return &cells_[cell_index_];
|
| + }
|
| +
|
| + inline Address CurrentCellBase() {
|
| + DCHECK(cell_index_ == Bitmap::IndexToCell(Bitmap::CellAlignIndex(
|
| + chunk_->AddressToMarkbitIndex(cell_base_))));
|
| + return cell_base_;
|
| + }
|
| +
|
| + inline void Advance() {
|
| + cell_index_++;
|
| + cell_base_ += 32 * kPointerSize;
|
| + }
|
| +
|
| + // Return the next mark bit cell. If there is no next it returns 0;
|
| + inline MarkBit::CellType PeekNext() {
|
| + if (HasNext()) {
|
| + return cells_[cell_index_ + 1];
|
| + }
|
| + return 0;
|
| + }
|
| +
|
| + private:
|
| + MemoryChunk* chunk_;
|
| + MarkBit::CellType* cells_;
|
| + unsigned int last_cell_index_;
|
| + unsigned int cell_index_;
|
| + Address cell_base_;
|
| +};
|
| +
|
| +// Grey objects can happen on black pages when black objects transition to
|
| +// grey e.g. when calling RecordWrites on them.
|
| +enum LiveObjectIterationMode {
|
| + kBlackObjects,
|
| + kGreyObjects,
|
| + kGreyObjectsOnBlackPage,
|
| + kAllLiveObjects
|
| +};
|
| +
|
| +template <LiveObjectIterationMode T>
|
| +class LiveObjectIterator BASE_EMBEDDED {
|
| + public:
|
| + explicit LiveObjectIterator(MemoryChunk* chunk)
|
| + : chunk_(chunk),
|
| + it_(chunk_),
|
| + cell_base_(it_.CurrentCellBase()),
|
| + current_cell_(*it_.CurrentCell()) {
|
| + // Black pages can only be iterated with kGreyObjectsOnBlackPage mode.
|
| + if (T != kGreyObjectsOnBlackPage) {
|
| + DCHECK(!chunk->IsFlagSet(Page::BLACK_PAGE));
|
| + }
|
| + }
|
| +
|
| + HeapObject* Next();
|
| +
|
| + private:
|
| + MemoryChunk* chunk_;
|
| + MarkBitCellIterator it_;
|
| + Address cell_base_;
|
| + MarkBit::CellType current_cell_;
|
| +};
|
|
|
| // -------------------------------------------------------------------------
|
| // Mark-Compact collector
|
| @@ -634,6 +715,7 @@ class MarkCompactCollector {
|
| // on various pages of the heap. Used by {RefillMarkingDeque} only.
|
| template <class T>
|
| void DiscoverGreyObjectsWithIterator(T* it);
|
| + template <LiveObjectIterationMode T>
|
| void DiscoverGreyObjectsOnPage(MemoryChunk* p);
|
| void DiscoverGreyObjectsInSpace(PagedSpace* space);
|
| void DiscoverGreyObjectsInNewSpace();
|
| @@ -773,80 +855,13 @@ class MarkCompactCollector {
|
| // Semaphore used to synchronize compaction tasks.
|
| base::Semaphore pending_compaction_tasks_semaphore_;
|
|
|
| + bool black_allocation_;
|
| +
|
| friend class Heap;
|
| friend class StoreBuffer;
|
| };
|
|
|
|
|
| -class MarkBitCellIterator BASE_EMBEDDED {
|
| - public:
|
| - explicit MarkBitCellIterator(MemoryChunk* chunk) : chunk_(chunk) {
|
| - last_cell_index_ = Bitmap::IndexToCell(Bitmap::CellAlignIndex(
|
| - chunk_->AddressToMarkbitIndex(chunk_->area_end())));
|
| - cell_base_ = chunk_->area_start();
|
| - cell_index_ = Bitmap::IndexToCell(
|
| - Bitmap::CellAlignIndex(chunk_->AddressToMarkbitIndex(cell_base_)));
|
| - cells_ = chunk_->markbits()->cells();
|
| - }
|
| -
|
| - inline bool Done() { return cell_index_ == last_cell_index_; }
|
| -
|
| - inline bool HasNext() { return cell_index_ < last_cell_index_ - 1; }
|
| -
|
| - inline MarkBit::CellType* CurrentCell() {
|
| - DCHECK(cell_index_ == Bitmap::IndexToCell(Bitmap::CellAlignIndex(
|
| - chunk_->AddressToMarkbitIndex(cell_base_))));
|
| - return &cells_[cell_index_];
|
| - }
|
| -
|
| - inline Address CurrentCellBase() {
|
| - DCHECK(cell_index_ == Bitmap::IndexToCell(Bitmap::CellAlignIndex(
|
| - chunk_->AddressToMarkbitIndex(cell_base_))));
|
| - return cell_base_;
|
| - }
|
| -
|
| - inline void Advance() {
|
| - cell_index_++;
|
| - cell_base_ += 32 * kPointerSize;
|
| - }
|
| -
|
| - // Return the next mark bit cell. If there is no next it returns 0;
|
| - inline MarkBit::CellType PeekNext() {
|
| - if (HasNext()) {
|
| - return cells_[cell_index_ + 1];
|
| - }
|
| - return 0;
|
| - }
|
| -
|
| - private:
|
| - MemoryChunk* chunk_;
|
| - MarkBit::CellType* cells_;
|
| - unsigned int last_cell_index_;
|
| - unsigned int cell_index_;
|
| - Address cell_base_;
|
| -};
|
| -
|
| -enum LiveObjectIterationMode { kBlackObjects, kGreyObjects, kAllLiveObjects };
|
| -
|
| -template <LiveObjectIterationMode T>
|
| -class LiveObjectIterator BASE_EMBEDDED {
|
| - public:
|
| - explicit LiveObjectIterator(MemoryChunk* chunk)
|
| - : chunk_(chunk),
|
| - it_(chunk_),
|
| - cell_base_(it_.CurrentCellBase()),
|
| - current_cell_(*it_.CurrentCell()) {}
|
| -
|
| - HeapObject* Next();
|
| -
|
| - private:
|
| - MemoryChunk* chunk_;
|
| - MarkBitCellIterator it_;
|
| - Address cell_base_;
|
| - MarkBit::CellType current_cell_;
|
| -};
|
| -
|
| -
|
| class EvacuationScope BASE_EMBEDDED {
|
| public:
|
| explicit EvacuationScope(MarkCompactCollector* collector)
|
|
|