| Index: src/heap/incremental-marking.cc
|
| diff --git a/src/incremental-marking.cc b/src/heap/incremental-marking.cc
|
| similarity index 91%
|
| rename from src/incremental-marking.cc
|
| rename to src/heap/incremental-marking.cc
|
| index 431e1ce456f4ae0cef4ee50d7a32149885a3dfe4..d2cd0a00253c655267ea737f1da236e373419cf8 100644
|
| --- a/src/incremental-marking.cc
|
| +++ b/src/heap/incremental-marking.cc
|
| @@ -4,7 +4,7 @@
|
|
|
| #include "src/v8.h"
|
|
|
| -#include "src/incremental-marking.h"
|
| +#include "src/heap/incremental-marking.h"
|
|
|
| #include "src/code-stubs.h"
|
| #include "src/compilation-cache.h"
|
| @@ -31,27 +31,23 @@ IncrementalMarking::IncrementalMarking(Heap* heap)
|
| unscanned_bytes_of_large_object_(0) {}
|
|
|
|
|
| -void IncrementalMarking::TearDown() {
|
| - delete marking_deque_memory_;
|
| -}
|
| +void IncrementalMarking::TearDown() { delete marking_deque_memory_; }
|
|
|
|
|
| -void IncrementalMarking::RecordWriteSlow(HeapObject* obj,
|
| - Object** slot,
|
| +void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot,
|
| Object* value) {
|
| if (BaseRecordWrite(obj, slot, value) && slot != NULL) {
|
| MarkBit obj_bit = Marking::MarkBitFrom(obj);
|
| if (Marking::IsBlack(obj_bit)) {
|
| // Object is not going to be rescanned we need to record the slot.
|
| - heap_->mark_compact_collector()->RecordSlot(
|
| - HeapObject::RawField(obj, 0), slot, value);
|
| + heap_->mark_compact_collector()->RecordSlot(HeapObject::RawField(obj, 0),
|
| + slot, value);
|
| }
|
| }
|
| }
|
|
|
|
|
| -void IncrementalMarking::RecordWriteFromCode(HeapObject* obj,
|
| - Object** slot,
|
| +void IncrementalMarking::RecordWriteFromCode(HeapObject* obj, Object** slot,
|
| Isolate* isolate) {
|
| DCHECK(obj->IsHeapObject());
|
| IncrementalMarking* marking = isolate->heap()->incremental_marking();
|
| @@ -61,7 +57,7 @@ void IncrementalMarking::RecordWriteFromCode(HeapObject* obj,
|
| if (counter < (MemoryChunk::kWriteBarrierCounterGranularity / 2)) {
|
| marking->write_barriers_invoked_since_last_step_ +=
|
| MemoryChunk::kWriteBarrierCounterGranularity -
|
| - chunk->write_barrier_counter();
|
| + chunk->write_barrier_counter();
|
| chunk->set_write_barrier_counter(
|
| MemoryChunk::kWriteBarrierCounterGranularity);
|
| }
|
| @@ -70,8 +66,7 @@ void IncrementalMarking::RecordWriteFromCode(HeapObject* obj,
|
| }
|
|
|
|
|
| -void IncrementalMarking::RecordCodeTargetPatch(Code* host,
|
| - Address pc,
|
| +void IncrementalMarking::RecordCodeTargetPatch(Code* host, Address pc,
|
| HeapObject* value) {
|
| if (IsMarking()) {
|
| RelocInfo rinfo(pc, RelocInfo::CODE_TARGET, 0, host);
|
| @@ -82,8 +77,9 @@ void IncrementalMarking::RecordCodeTargetPatch(Code* host,
|
|
|
| void IncrementalMarking::RecordCodeTargetPatch(Address pc, HeapObject* value) {
|
| if (IsMarking()) {
|
| - Code* host = heap_->isolate()->inner_pointer_to_code_cache()->
|
| - GcSafeFindCodeForInnerPointer(pc);
|
| + Code* host = heap_->isolate()
|
| + ->inner_pointer_to_code_cache()
|
| + ->GcSafeFindCodeForInnerPointer(pc);
|
| RelocInfo rinfo(pc, RelocInfo::CODE_TARGET, 0, host);
|
| RecordWriteIntoCode(host, &rinfo, value);
|
| }
|
| @@ -95,8 +91,8 @@ void IncrementalMarking::RecordWriteOfCodeEntrySlow(JSFunction* host,
|
| Code* value) {
|
| if (BaseRecordWrite(host, slot, value)) {
|
| DCHECK(slot != NULL);
|
| - heap_->mark_compact_collector()->
|
| - RecordCodeEntrySlot(reinterpret_cast<Address>(slot), value);
|
| + heap_->mark_compact_collector()->RecordCodeEntrySlot(
|
| + reinterpret_cast<Address>(slot), value);
|
| }
|
| }
|
|
|
| @@ -140,8 +136,7 @@ static void MarkObjectGreyDoNotEnqueue(Object* obj) {
|
|
|
|
|
| static inline void MarkBlackOrKeepGrey(HeapObject* heap_object,
|
| - MarkBit mark_bit,
|
| - int size) {
|
| + MarkBit mark_bit, int size) {
|
| DCHECK(!Marking::IsImpossible(mark_bit));
|
| if (mark_bit.Get()) return;
|
| mark_bit.Set();
|
| @@ -151,8 +146,7 @@ static inline void MarkBlackOrKeepGrey(HeapObject* heap_object,
|
|
|
|
|
| static inline void MarkBlackOrKeepBlack(HeapObject* heap_object,
|
| - MarkBit mark_bit,
|
| - int size) {
|
| + MarkBit mark_bit, int size) {
|
| DCHECK(!Marking::IsImpossible(mark_bit));
|
| if (Marking::IsBlack(mark_bit)) return;
|
| Marking::MarkBlack(mark_bit);
|
| @@ -188,15 +182,14 @@ class IncrementalMarkingMarkingVisitor
|
| // fully scanned. Fall back to scanning it through to the end in case this
|
| // fails because of a full deque.
|
| int object_size = FixedArray::BodyDescriptor::SizeOf(map, object);
|
| - int start_offset = Max(FixedArray::BodyDescriptor::kStartOffset,
|
| - chunk->progress_bar());
|
| - int end_offset = Min(object_size,
|
| - start_offset + kProgressBarScanningChunk);
|
| + int start_offset =
|
| + Max(FixedArray::BodyDescriptor::kStartOffset, chunk->progress_bar());
|
| + int end_offset =
|
| + Min(object_size, start_offset + kProgressBarScanningChunk);
|
| int already_scanned_offset = start_offset;
|
| bool scan_until_end = false;
|
| do {
|
| - VisitPointersWithAnchor(heap,
|
| - HeapObject::RawField(object, 0),
|
| + VisitPointersWithAnchor(heap, HeapObject::RawField(object, 0),
|
| HeapObject::RawField(object, start_offset),
|
| HeapObject::RawField(object, end_offset));
|
| start_offset = end_offset;
|
| @@ -245,10 +238,8 @@ class IncrementalMarkingMarkingVisitor
|
| }
|
| }
|
|
|
| - INLINE(static void VisitPointersWithAnchor(Heap* heap,
|
| - Object** anchor,
|
| - Object** start,
|
| - Object** end)) {
|
| + INLINE(static void VisitPointersWithAnchor(Heap* heap, Object** anchor,
|
| + Object** start, Object** end)) {
|
| for (Object** p = start; p < end; p++) {
|
| Object* obj = *p;
|
| if (obj->IsHeapObject()) {
|
| @@ -289,12 +280,9 @@ class IncrementalMarkingRootMarkingVisitor : public ObjectVisitor {
|
| public:
|
| explicit IncrementalMarkingRootMarkingVisitor(
|
| IncrementalMarking* incremental_marking)
|
| - : incremental_marking_(incremental_marking) {
|
| - }
|
| + : incremental_marking_(incremental_marking) {}
|
|
|
| - void VisitPointer(Object** p) {
|
| - MarkObjectByPointer(p);
|
| - }
|
| + void VisitPointer(Object** p) { MarkObjectByPointer(p); }
|
|
|
| void VisitPointers(Object** start, Object** end) {
|
| for (Object** p = start; p < end; p++) MarkObjectByPointer(p);
|
| @@ -334,8 +322,7 @@ void IncrementalMarking::SetOldSpacePageFlags(MemoryChunk* chunk,
|
|
|
| // It's difficult to filter out slots recorded for large objects.
|
| if (chunk->owner()->identity() == LO_SPACE &&
|
| - chunk->size() > static_cast<size_t>(Page::kPageSize) &&
|
| - is_compacting) {
|
| + chunk->size() > static_cast<size_t>(Page::kPageSize) && is_compacting) {
|
| chunk->SetFlag(MemoryChunk::RESCAN_ON_EVACUATION);
|
| }
|
| } else if (chunk->owner()->identity() == CELL_SPACE ||
|
| @@ -445,18 +432,16 @@ bool IncrementalMarking::WorthActivating() {
|
| // Only start incremental marking in a safe state: 1) when incremental
|
| // marking is turned on, 2) when we are currently not in a GC, and
|
| // 3) when we are currently not serializing or deserializing the heap.
|
| - return FLAG_incremental_marking &&
|
| - FLAG_incremental_marking_steps &&
|
| - heap_->gc_state() == Heap::NOT_IN_GC &&
|
| - !heap_->isolate()->serializer_enabled() &&
|
| - heap_->isolate()->IsInitialized() &&
|
| - heap_->PromotedSpaceSizeOfObjects() > kActivationThreshold;
|
| + return FLAG_incremental_marking && FLAG_incremental_marking_steps &&
|
| + heap_->gc_state() == Heap::NOT_IN_GC &&
|
| + !heap_->isolate()->serializer_enabled() &&
|
| + heap_->isolate()->IsInitialized() &&
|
| + heap_->PromotedSpaceSizeOfObjects() > kActivationThreshold;
|
| }
|
|
|
|
|
| void IncrementalMarking::ActivateGeneratedStub(Code* stub) {
|
| - DCHECK(RecordWriteStub::GetMode(stub) ==
|
| - RecordWriteStub::STORE_BUFFER_ONLY);
|
| + DCHECK(RecordWriteStub::GetMode(stub) == RecordWriteStub::STORE_BUFFER_ONLY);
|
|
|
| if (!IsMarking()) {
|
| // Initially stub is generated in STORE_BUFFER_ONLY mode thus
|
| @@ -480,8 +465,7 @@ static void PatchIncrementalMarkingRecordWriteStubs(
|
| if (stubs->IsKey(k)) {
|
| uint32_t key = NumberToUint32(k);
|
|
|
| - if (CodeStub::MajorKeyFromKey(key) ==
|
| - CodeStub::RecordWrite) {
|
| + if (CodeStub::MajorKeyFromKey(key) == CodeStub::RecordWrite) {
|
| Object* e = stubs->ValueAt(i);
|
| if (e->IsCode()) {
|
| RecordWriteStub::Patch(Code::cast(e), mode);
|
| @@ -550,13 +534,14 @@ void IncrementalMarking::StartMarking(CompactionFlag flag) {
|
| }
|
|
|
| is_compacting_ = !FLAG_never_compact && (flag == ALLOW_COMPACTION) &&
|
| - heap_->mark_compact_collector()->StartCompaction(
|
| - MarkCompactCollector::INCREMENTAL_COMPACTION);
|
| + heap_->mark_compact_collector()->StartCompaction(
|
| + MarkCompactCollector::INCREMENTAL_COMPACTION);
|
|
|
| state_ = MARKING;
|
|
|
| - RecordWriteStub::Mode mode = is_compacting_ ?
|
| - RecordWriteStub::INCREMENTAL_COMPACTION : RecordWriteStub::INCREMENTAL;
|
| + RecordWriteStub::Mode mode = is_compacting_
|
| + ? RecordWriteStub::INCREMENTAL_COMPACTION
|
| + : RecordWriteStub::INCREMENTAL;
|
|
|
| PatchIncrementalMarkingRecordWriteStubs(heap_, mode);
|
|
|
| @@ -570,7 +555,7 @@ void IncrementalMarking::StartMarking(CompactionFlag flag) {
|
|
|
| ActivateIncrementalWriteBarrier();
|
|
|
| - // Marking bits are cleared by the sweeper.
|
| +// Marking bits are cleared by the sweeper.
|
| #ifdef VERIFY_HEAP
|
| if (FLAG_verify_heap) {
|
| heap_->mark_compact_collector()->VerifyMarkbitsAreClean();
|
| @@ -644,12 +629,12 @@ void IncrementalMarking::UpdateMarkingDequeAfterScavenge() {
|
| new_top = ((new_top + 1) & mask);
|
| DCHECK(new_top != marking_deque_.bottom());
|
| #ifdef DEBUG
|
| - MarkBit mark_bit = Marking::MarkBitFrom(obj);
|
| - MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address());
|
| - DCHECK(Marking::IsGrey(mark_bit) ||
|
| - (obj->IsFiller() && Marking::IsWhite(mark_bit)) ||
|
| - (chunk->IsFlagSet(MemoryChunk::HAS_PROGRESS_BAR) &&
|
| - Marking::IsBlack(mark_bit)));
|
| + MarkBit mark_bit = Marking::MarkBitFrom(obj);
|
| + MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address());
|
| + DCHECK(Marking::IsGrey(mark_bit) ||
|
| + (obj->IsFiller() && Marking::IsWhite(mark_bit)) ||
|
| + (chunk->IsFlagSet(MemoryChunk::HAS_PROGRESS_BAR) &&
|
| + Marking::IsBlack(mark_bit)));
|
| #endif
|
| }
|
| }
|
| @@ -838,8 +823,7 @@ void IncrementalMarking::OldSpaceStep(intptr_t allocated) {
|
|
|
| void IncrementalMarking::Step(intptr_t allocated_bytes,
|
| CompletionAction action) {
|
| - if (heap_->gc_state() != Heap::NOT_IN_GC ||
|
| - !FLAG_incremental_marking ||
|
| + if (heap_->gc_state() != Heap::NOT_IN_GC || !FLAG_incremental_marking ||
|
| !FLAG_incremental_marking_steps ||
|
| (state_ != SWEEPING && state_ != MARKING)) {
|
| return;
|
| @@ -983,5 +967,5 @@ void IncrementalMarking::ResetStepCounters() {
|
| int64_t IncrementalMarking::SpaceLeftInOldSpace() {
|
| return heap_->MaxOldGenerationSize() - heap_->PromotedSpaceSizeOfObjects();
|
| }
|
| -
|
| -} } // namespace v8::internal
|
| +}
|
| +} // namespace v8::internal
|
|
|