Commit 3a9471f8 authored by Keishi Hattori's avatar Keishi Hattori Committed by Commit Bot

Oilpan: Move MarkAsUnswept from before marking to after

When incremental marking is enabled, new pages are allocated while marking. By moving the MarkAsUnswept from before marking to after, this simplifies swept flag management. This is because pre sweep all pages become unswept.

This CL also adjusts ObjectPayloadSizeForTesting for this change.

Change-Id: Ic5ea315a2cfd2c65e8d8f08e55b1d202fbeb5915
Reviewed-on: https://chromium-review.googlesource.com/938887
Commit-Queue: Keishi Hattori <keishi@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarMichael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#539808}
parent fa7feb3a
......@@ -489,8 +489,10 @@ size_t ThreadHeap::ObjectPayloadSizeForTesting() {
size_t object_payload_size = 0;
thread_state_->SetGCState(ThreadState::kGCRunning);
thread_state_->Heap().MakeConsistentForGC();
thread_state_->Heap().PrepareForSweep();
for (int i = 0; i < BlinkGC::kNumberOfArenas; ++i)
object_payload_size += arenas_[i]->ObjectPayloadSizeForTesting();
MakeConsistentForMutator();
thread_state_->SetGCState(ThreadState::kSweeping);
thread_state_->SetGCState(ThreadState::kNoGCScheduled);
return object_payload_size;
......
......@@ -171,9 +171,6 @@ void BaseArena::MakeConsistentForGC() {
#if DCHECK_IS_ON()
DCHECK(IsConsistentForGC());
#endif
for (BasePage* page = first_page_; page; page = page->Next()) {
page->MarkAsUnswept();
}
// We should not start a new GC until we finish sweeping in the current GC.
CHECK(SweepingCompleted());
......@@ -220,19 +217,14 @@ size_t BaseArena::ObjectPayloadSizeForTesting() {
#if DCHECK_IS_ON()
DCHECK(IsConsistentForGC());
#endif
DCHECK(SweepingCompleted());
// DCHECK(SweepingCompleted());
size_t object_payload_size = 0;
for (BasePage* page = first_page_; page; page = page->Next())
for (BasePage* page = first_unswept_page_; page; page = page->Next())
object_payload_size += page->ObjectPayloadSizeForTesting();
return object_payload_size;
}
size_t NormalPageArena::ObjectPayloadSizeForTesting() {
SetAllocationPoint(nullptr, 0);
return BaseArena::ObjectPayloadSizeForTesting();
}
void BaseArena::PrepareForSweep() {
DCHECK(GetThreadState()->IsInGC());
DCHECK(SweepingCompleted());
......@@ -242,6 +234,10 @@ void BaseArena::PrepareForSweep() {
// Verification depends on the allocation point being cleared.
Verify();
for (BasePage* page = first_page_; page; page = page->Next()) {
page->MarkAsUnswept();
}
// Move all pages to a list of unswept pages.
first_unswept_page_ = first_page_;
first_page_ = nullptr;
......@@ -1276,7 +1272,6 @@ NormalPage::~NormalPage() {
size_t NormalPage::ObjectPayloadSizeForTesting() {
size_t object_payload_size = 0;
Address header_address = Payload();
MarkAsSwept();
DCHECK_NE(header_address, PayloadEnd());
do {
HeapObjectHeader* header =
......@@ -1731,7 +1726,6 @@ LargeObjectPage::LargeObjectPage(PageMemory* storage,
}
size_t LargeObjectPage::ObjectPayloadSizeForTesting() {
MarkAsSwept();
return PayloadSize();
}
......
......@@ -784,7 +784,7 @@ class PLATFORM_EXPORT BaseArena {
#if DCHECK_IS_ON()
virtual bool IsConsistentForGC() = 0;
#endif
virtual size_t ObjectPayloadSizeForTesting();
size_t ObjectPayloadSizeForTesting();
void PrepareForSweep();
#if defined(ADDRESS_SANITIZER)
void PoisonArena();
......@@ -844,7 +844,6 @@ class PLATFORM_EXPORT NormalPageArena final : public BaseArena {
bool PagesToBeSweptContains(Address);
#endif
void TakeFreelistSnapshot(const String& dump_base_name) override;
size_t ObjectPayloadSizeForTesting() override;
Address AllocateObject(size_t allocation_size, size_t gc_info_index);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment