summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/remembered-set.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/heap/remembered-set.h')
-rw-r--r--deps/v8/src/heap/remembered-set.h36
1 files changed, 16 insertions, 20 deletions
diff --git a/deps/v8/src/heap/remembered-set.h b/deps/v8/src/heap/remembered-set.h
index 8022d52775..74791b926b 100644
--- a/deps/v8/src/heap/remembered-set.h
+++ b/deps/v8/src/heap/remembered-set.h
@@ -116,10 +116,13 @@ class RememberedSet {
size_t pages = (chunk->size() + Page::kPageSize - 1) / Page::kPageSize;
int new_count = 0;
for (size_t page = 0; page < pages; page++) {
- new_count += slots[page].Iterate(callback);
+ new_count +=
+ slots[page].Iterate(callback, SlotSet::PREFREE_EMPTY_BUCKETS);
}
- if (new_count == 0) {
- ReleaseSlotSet(chunk);
+ // Only old-to-old slot sets are released eagerly. Old-new-slot sets are
+ // released by the sweeper threads.
+ if (direction == OLD_TO_OLD && new_count == 0) {
+ chunk->ReleaseOldToOldSlots();
}
}
}
@@ -149,10 +152,13 @@ class RememberedSet {
static void RemoveRangeTyped(MemoryChunk* page, Address start, Address end) {
TypedSlotSet* slots = GetTypedSlotSet(page);
if (slots != nullptr) {
- slots->Iterate([start, end](SlotType slot_type, Address host_addr,
- Address slot_addr) {
- return start <= slot_addr && slot_addr < end ? REMOVE_SLOT : KEEP_SLOT;
- });
+ slots->Iterate(
+ [start, end](SlotType slot_type, Address host_addr,
+ Address slot_addr) {
+ return start <= slot_addr && slot_addr < end ? REMOVE_SLOT
+ : KEEP_SLOT;
+ },
+ TypedSlotSet::PREFREE_EMPTY_CHUNKS);
}
}
@@ -173,7 +179,7 @@ class RememberedSet {
static void IterateTyped(MemoryChunk* chunk, Callback callback) {
TypedSlotSet* slots = GetTypedSlotSet(chunk);
if (slots != nullptr) {
- int new_count = slots->Iterate(callback);
+ int new_count = slots->Iterate(callback, TypedSlotSet::KEEP_EMPTY_CHUNKS);
if (new_count == 0) {
ReleaseTypedSlotSet(chunk);
}
@@ -216,19 +222,9 @@ class RememberedSet {
}
}
- static void ReleaseSlotSet(MemoryChunk* chunk) {
- if (direction == OLD_TO_OLD) {
- chunk->ReleaseOldToOldSlots();
- } else {
- chunk->ReleaseOldToNewSlots();
- }
- }
-
static void ReleaseTypedSlotSet(MemoryChunk* chunk) {
if (direction == OLD_TO_OLD) {
chunk->ReleaseTypedOldToOldSlots();
- } else {
- chunk->ReleaseTypedOldToNewSlots();
}
}
@@ -363,7 +359,7 @@ class UpdateTypedSlotHelper {
case OBJECT_SLOT: {
return callback(reinterpret_cast<Object**>(addr));
}
- case NUMBER_OF_SLOT_TYPES:
+ case CLEARED_SLOT:
break;
}
UNREACHABLE();
@@ -382,7 +378,7 @@ inline SlotType SlotTypeForRelocInfoMode(RelocInfo::Mode rmode) {
return DEBUG_TARGET_SLOT;
}
UNREACHABLE();
- return NUMBER_OF_SLOT_TYPES;
+ return CLEARED_SLOT;
}
} // namespace internal