Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(374)

Unified Diff: src/heap/spaces.cc

Issue 2770253002: [heap] Enforce explicit MarkingState (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/spaces.h ('k') | src/heap/spaces-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/spaces.cc
diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc
index d322916a5dc0a9cbc2957f961f407f11976d32b2..85815a0e32577a0446a13b46bb40b37f9096e71d 100644
--- a/src/heap/spaces.cc
+++ b/src/heap/spaces.cc
@@ -538,12 +538,13 @@ MemoryChunk* MemoryChunk::Initialize(Heap* heap, Address base, size_t size,
chunk->mutex_ = new base::Mutex();
chunk->available_in_free_list_ = 0;
chunk->wasted_memory_ = 0;
- chunk->ClearLiveness();
chunk->young_generation_bitmap_ = nullptr;
chunk->set_next_chunk(nullptr);
chunk->set_prev_chunk(nullptr);
chunk->local_tracker_ = nullptr;
+ MarkingState::Internal(chunk).ClearLiveness();
+
DCHECK(OFFSET_OF(MemoryChunk, flags_) == kFlagsOffset);
if (executable == EXECUTABLE) {
@@ -854,9 +855,10 @@ void Page::CreateBlackArea(Address start, Address end) {
DCHECK_EQ(Page::FromAddress(start), this);
DCHECK_NE(start, end);
DCHECK_EQ(Page::FromAddress(end - 1), this);
- markbits()->SetRange(AddressToMarkbitIndex(start),
- AddressToMarkbitIndex(end));
- IncrementLiveBytes(static_cast<int>(end - start));
+ MarkingState::Internal(this).bitmap()->SetRange(AddressToMarkbitIndex(start),
+ AddressToMarkbitIndex(end));
+ MarkingState::Internal(this).IncrementLiveBytes(
+ static_cast<int>(end - start));
}
void MemoryAllocator::PartialFreeMemory(MemoryChunk* chunk,
@@ -1196,15 +1198,6 @@ void MemoryChunk::ReleaseYoungGenerationBitmap() {
young_generation_bitmap_ = nullptr;
}
-template <MarkingMode mode>
-void MemoryChunk::ClearLiveness() {
- markbits<mode>()->Clear();
- ResetLiveBytes<mode>();
-}
-
-template void MemoryChunk::ClearLiveness<MarkingMode::FULL>();
-template void MemoryChunk::ClearLiveness<MarkingMode::YOUNG_GENERATION>();
-
// -----------------------------------------------------------------------------
// PagedSpace implementation
@@ -1420,9 +1413,11 @@ void PagedSpace::EmptyAllocationInfo() {
// Clear the bits in the unused black area.
if (current_top != current_limit) {
- page->markbits()->ClearRange(page->AddressToMarkbitIndex(current_top),
- page->AddressToMarkbitIndex(current_limit));
- page->IncrementLiveBytes(-static_cast<int>(current_limit - current_top));
+ MarkingState::Internal(page).bitmap()->ClearRange(
+ page->AddressToMarkbitIndex(current_top),
+ page->AddressToMarkbitIndex(current_limit));
+ MarkingState::Internal(page).IncrementLiveBytes(
+ -static_cast<int>(current_limit - current_top));
}
}
@@ -1436,7 +1431,7 @@ void PagedSpace::IncreaseCapacity(size_t bytes) {
}
void PagedSpace::ReleasePage(Page* page) {
- DCHECK_EQ(page->LiveBytes(), 0);
+ DCHECK_EQ(0, MarkingState::Internal(page).live_bytes());
DCHECK_EQ(page->owner(), this);
free_list_.EvictFreeListItems(page);
@@ -1497,14 +1492,14 @@ void PagedSpace::Verify(ObjectVisitor* visitor) {
// All the interior pointers should be contained in the heap.
int size = object->Size();
object->IterateBody(map->instance_type(), size, visitor);
- if (ObjectMarking::IsBlack(object)) {
+ if (ObjectMarking::IsBlack(object, MarkingState::Internal(object))) {
black_size += size;
}
CHECK(object->address() + size <= top);
end_of_previous_object = object->address() + size;
}
- CHECK_LE(black_size, page->LiveBytes());
+ CHECK_LE(black_size, MarkingState::Internal(page).live_bytes());
}
CHECK(allocation_pointer_found_in_space);
}
@@ -1637,7 +1632,7 @@ bool SemiSpace::EnsureCurrentCapacity() {
if (current_page == nullptr) return false;
DCHECK_NOT_NULL(current_page);
current_page->InsertAfter(anchor());
- current_page->ClearLiveness();
+ MarkingState::Internal(current_page).ClearLiveness();
current_page->SetFlags(anchor()->prev_page()->GetFlags(),
static_cast<uintptr_t>(Page::kCopyAllFlags));
heap()->CreateFillerObjectAt(current_page->area_start(),
@@ -1709,7 +1704,7 @@ void NewSpace::ResetAllocationInfo() {
UpdateAllocationInfo();
// Clear all mark-bits in the to-space.
for (Page* p : to_space_) {
- p->ClearLiveness();
+ MarkingState::Internal(p).ClearLiveness();
}
InlineAllocationStep(old_top, allocation_info_.top(), nullptr, 0);
}
@@ -2010,7 +2005,7 @@ bool SemiSpace::GrowTo(size_t new_capacity) {
return false;
}
new_page->InsertAfter(last_page);
- new_page->ClearLiveness();
+ MarkingState::Internal(new_page).ClearLiveness();
// Duplicate the flags that was set on the old page.
new_page->SetFlags(last_page->GetFlags(), Page::kCopyOnFlipFlagsMask);
last_page = new_page;
@@ -2071,7 +2066,7 @@ void SemiSpace::FixPagesFlags(intptr_t flags, intptr_t mask) {
page->ClearFlag(MemoryChunk::IN_FROM_SPACE);
page->SetFlag(MemoryChunk::IN_TO_SPACE);
page->ClearFlag(MemoryChunk::NEW_SPACE_BELOW_AGE_MARK);
- page->ResetLiveBytes();
+ MarkingState::Internal(page).SetLiveBytes(0);
} else {
page->SetFlag(MemoryChunk::IN_FROM_SPACE);
page->ClearFlag(MemoryChunk::IN_TO_SPACE);
@@ -3044,7 +3039,7 @@ AllocationResult LargeObjectSpace::AllocateRaw(int object_size,
ClearRecordedSlots::kNo);
if (heap()->incremental_marking()->black_allocation()) {
- ObjectMarking::WhiteToBlack(object);
+ ObjectMarking::WhiteToBlack(object, MarkingState::Internal(object));
}
return object;
}
@@ -3091,13 +3086,14 @@ LargePage* LargeObjectSpace::FindPage(Address a) {
void LargeObjectSpace::ClearMarkingStateOfLiveObjects() {
LargeObjectIterator it(this);
for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) {
- if (ObjectMarking::IsBlackOrGrey(obj)) {
- Marking::MarkWhite(ObjectMarking::MarkBitFrom(obj));
+ if (ObjectMarking::IsBlackOrGrey(obj, MarkingState::Internal(obj))) {
+ Marking::MarkWhite(
+ ObjectMarking::MarkBitFrom(obj, MarkingState::Internal(obj)));
MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address());
chunk->ResetProgressBar();
- chunk->ResetLiveBytes();
+ MarkingState::Internal(chunk).SetLiveBytes(0);
}
- DCHECK(ObjectMarking::IsWhite(obj));
+ DCHECK(ObjectMarking::IsWhite(obj, MarkingState::Internal(obj)));
}
}
@@ -3139,8 +3135,8 @@ void LargeObjectSpace::FreeUnmarkedObjects() {
LargePage* current = first_page_;
while (current != NULL) {
HeapObject* object = current->GetObject();
- DCHECK(!ObjectMarking::IsGrey(object));
- if (ObjectMarking::IsBlack(object)) {
+ DCHECK(!ObjectMarking::IsGrey(object, MarkingState::Internal(object)));
+ if (ObjectMarking::IsBlack(object, MarkingState::Internal(object))) {
Address free_start;
if ((free_start = current->GetAddressToShrink()) != 0) {
// TODO(hpayer): Perform partial free concurrently.
@@ -3276,7 +3272,8 @@ void Page::Print() {
unsigned mark_size = 0;
for (HeapObject* object = objects.Next(); object != NULL;
object = objects.Next()) {
- bool is_marked = ObjectMarking::IsBlackOrGrey(object);
+ bool is_marked =
+ ObjectMarking::IsBlackOrGrey(object, MarkingState::Internal(object));
PrintF(" %c ", (is_marked ? '!' : ' ')); // Indent a little.
if (is_marked) {
mark_size += object->Size();
@@ -3285,7 +3282,8 @@ void Page::Print() {
PrintF("\n");
}
printf(" --------------------------------------\n");
- printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes());
+ printf(" Marked: %x, LiveCount: %" V8PRIdPTR "\n", mark_size,
+ MarkingState::Internal(this).live_bytes());
}
#endif // DEBUG
« no previous file with comments | « src/heap/spaces.h ('k') | src/heap/spaces-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698