Skip to content

Commit 6adf7e8

Browse files
mlippautzCommit Bot
authored and
Commit Bot
committed
cppgc: Fix PrepareForSweepVisitor
The visitor was removing pages while at the same time iterating them on NormalPagedSpace. Removing all pages at once is safe and should also be faster. Bug: chromium:1056170 Change-Id: I56eedf6f09498f126cb09238e01962b48e75b657 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2190427 Reviewed-by: Omer Katz <[email protected]> Reviewed-by: Anton Bikineev <[email protected]> Commit-Queue: Michael Lippautz <[email protected]> Cr-Commit-Position: refs/heads/master@{#67687}
1 parent f640aea commit 6adf7e8

File tree

5 files changed

+25
-14
lines changed

5 files changed

+25
-14
lines changed

src/heap/cppgc/heap-space.cc

+6
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ void BaseSpace::RemovePage(BasePage* page) {
2626
pages_.erase(it);
2727
}
2828

29+
BaseSpace::Pages BaseSpace::RemoveAllPages() {
30+
Pages pages = std::move(pages_);
31+
pages_.clear();
32+
return pages;
33+
}
34+
2935
NormalPageSpace::NormalPageSpace(RawHeap* heap, size_t index)
3036
: BaseSpace(heap, index, PageType::kNormal) {}
3137

src/heap/cppgc/heap-space.h

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class V8_EXPORT_PRIVATE BaseSpace {
4444
// Page manipulation functions.
4545
void AddPage(BasePage*);
4646
void RemovePage(BasePage*);
47+
Pages RemoveAllPages();
4748

4849
protected:
4950
enum class PageType { kNormal, kLarge };

src/heap/cppgc/object-allocator-inl.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void* ObjectAllocator::AllocateObject(size_t size, GCInfoIndex gcinfo,
3737
}
3838

3939
// static
40-
inline RawHeap::RegularSpaceType ObjectAllocator::GetInitialSpaceIndexForSize(
40+
RawHeap::RegularSpaceType ObjectAllocator::GetInitialSpaceIndexForSize(
4141
size_t size) {
4242
if (size < 64) {
4343
if (size < 32) return RawHeap::RegularSpaceType::kNormal1;

src/heap/cppgc/sweeper.cc

+5-13
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <vector>
88

99
#include "src/heap/cppgc/free-list.h"
10+
#include "src/heap/cppgc/globals.h"
1011
#include "src/heap/cppgc/heap-object-header-inl.h"
1112
#include "src/heap/cppgc/heap-object-header.h"
1213
#include "src/heap/cppgc/heap-page.h"
@@ -80,26 +81,17 @@ class PrepareForSweepVisitor final
8081
bool VisitNormalPageSpace(NormalPageSpace* space) {
8182
space->ResetLinearAllocationBuffer();
8283
space->free_list().Clear();
83-
return false;
84-
}
85-
86-
bool VisitNormalPage(NormalPage* page) {
87-
MovePageToSweeper(page);
84+
(*states_)[space->index()].unswept_pages = space->RemoveAllPages();
8885
return true;
8986
}
9087

91-
bool VisitLargePage(LargePage* page) {
92-
MovePageToSweeper(page);
88+
bool VisitLargePageSpace(LargePageSpace* space) {
89+
(*states_)[space->index()].unswept_pages = space->RemoveAllPages();
90+
9391
return true;
9492
}
9593

9694
private:
97-
void MovePageToSweeper(BasePage* page) {
98-
BaseSpace* space = page->space();
99-
space->RemovePage(page);
100-
(*states_)[space->index()].unswept_pages.push_back(page);
101-
}
102-
10395
SpaceStates* states_;
10496
};
10597

test/unittests/heap/cppgc/sweeper-unittest.cc

+12
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,18 @@ TEST_F(SweeperTest, SweepObjectsOnAllArenas) {
156156
EXPECT_EQ(5u, g_destructor_callcount);
157157
}
158158

159+
TEST_F(SweeperTest, SweepMultiplePagesInSingleSpace) {
160+
MakeGarbageCollected<GCed<2 * kLargeObjectSizeThreshold>>(GetHeap());
161+
MakeGarbageCollected<GCed<2 * kLargeObjectSizeThreshold>>(GetHeap());
162+
MakeGarbageCollected<GCed<2 * kLargeObjectSizeThreshold>>(GetHeap());
163+
164+
EXPECT_EQ(0u, g_destructor_callcount);
165+
166+
Sweep();
167+
168+
EXPECT_EQ(3u, g_destructor_callcount);
169+
}
170+
159171
TEST_F(SweeperTest, CoalesceFreeListEntries) {
160172
constexpr size_t kObjectSize = 32;
161173
using Type = GCed<kObjectSize>;

0 commit comments

Comments
 (0)