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

Side by Side Diff: src/heap/remembered-set.h

Issue 2390743005: [heap] Concurrently free empty slot set buckets. (Closed)
Patch Set: Created 4 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_REMEMBERED_SET_H 5 #ifndef V8_REMEMBERED_SET_H
6 #define V8_REMEMBERED_SET_H 6 #define V8_REMEMBERED_SET_H
7 7
8 #include "src/assembler.h" 8 #include "src/assembler.h"
9 #include "src/heap/heap.h" 9 #include "src/heap/heap.h"
10 #include "src/heap/slot-set.h" 10 #include "src/heap/slot-set.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 // Iterates and filters the remembered set in the given memory chunk with 109 // Iterates and filters the remembered set in the given memory chunk with
110 // the given callback. The callback should take (Address slot) and return 110 // the given callback. The callback should take (Address slot) and return
111 // SlotCallbackResult. 111 // SlotCallbackResult.
112 template <typename Callback> 112 template <typename Callback>
113 static void Iterate(MemoryChunk* chunk, Callback callback) { 113 static void Iterate(MemoryChunk* chunk, Callback callback) {
114 SlotSet* slots = GetSlotSet(chunk); 114 SlotSet* slots = GetSlotSet(chunk);
115 if (slots != nullptr) { 115 if (slots != nullptr) {
116 size_t pages = (chunk->size() + Page::kPageSize - 1) / Page::kPageSize; 116 size_t pages = (chunk->size() + Page::kPageSize - 1) / Page::kPageSize;
117 int new_count = 0; 117 int new_count = 0;
118 for (size_t page = 0; page < pages; page++) { 118 for (size_t page = 0; page < pages; page++) {
119 new_count += slots[page].Iterate(callback); 119 new_count +=
120 slots[page].Iterate(callback, SlotSet::PREFREE_EMPTY_BUCKETS);
120 } 121 }
121 if (new_count == 0) { 122 // Only old-to-old slot sets are released eagerly. Old-new-slot sets are
122 ReleaseSlotSet(chunk); 123 // released by the sweeper threads.
124 if (direction == OLD_TO_OLD && new_count == 0) {
125 chunk->ReleaseOldToOldSlots();
123 } 126 }
124 } 127 }
125 } 128 }
126 129
127 // Given a page and a typed slot in that page, this function adds the slot 130 // Given a page and a typed slot in that page, this function adds the slot
128 // to the remembered set. 131 // to the remembered set.
129 static void InsertTyped(Page* page, Address host_addr, SlotType slot_type, 132 static void InsertTyped(Page* page, Address host_addr, SlotType slot_type,
130 Address slot_addr) { 133 Address slot_addr) {
131 TypedSlotSet* slot_set = GetTypedSlotSet(page); 134 TypedSlotSet* slot_set = GetTypedSlotSet(page);
132 if (slot_set == nullptr) { 135 if (slot_set == nullptr) {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 } 215 }
213 216
214 static TypedSlotSet* GetTypedSlotSet(MemoryChunk* chunk) { 217 static TypedSlotSet* GetTypedSlotSet(MemoryChunk* chunk) {
215 if (direction == OLD_TO_OLD) { 218 if (direction == OLD_TO_OLD) {
216 return chunk->typed_old_to_old_slots(); 219 return chunk->typed_old_to_old_slots();
217 } else { 220 } else {
218 return chunk->typed_old_to_new_slots(); 221 return chunk->typed_old_to_new_slots();
219 } 222 }
220 } 223 }
221 224
222 static void ReleaseSlotSet(MemoryChunk* chunk) {
223 if (direction == OLD_TO_OLD) {
224 chunk->ReleaseOldToOldSlots();
225 } else {
226 chunk->ReleaseOldToNewSlots();
227 }
228 }
229
230 static void ReleaseTypedSlotSet(MemoryChunk* chunk) { 225 static void ReleaseTypedSlotSet(MemoryChunk* chunk) {
231 if (direction == OLD_TO_OLD) { 226 if (direction == OLD_TO_OLD) {
232 chunk->ReleaseTypedOldToOldSlots(); 227 chunk->ReleaseTypedOldToOldSlots();
233 } 228 }
234 } 229 }
235 230
236 static SlotSet* AllocateSlotSet(MemoryChunk* chunk) { 231 static SlotSet* AllocateSlotSet(MemoryChunk* chunk) {
237 if (direction == OLD_TO_OLD) { 232 if (direction == OLD_TO_OLD) {
238 chunk->AllocateOldToOldSlots(); 233 chunk->AllocateOldToOldSlots();
239 return chunk->old_to_old_slots(); 234 return chunk->old_to_old_slots();
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 return DEBUG_TARGET_SLOT; 378 return DEBUG_TARGET_SLOT;
384 } 379 }
385 UNREACHABLE(); 380 UNREACHABLE();
386 return CLEARED_SLOT; 381 return CLEARED_SLOT;
387 } 382 }
388 383
389 } // namespace internal 384 } // namespace internal
390 } // namespace v8 385 } // namespace v8
391 386
392 #endif // V8_REMEMBERED_SET_H 387 #endif // V8_REMEMBERED_SET_H
OLDNEW
« no previous file with comments | « src/heap/mark-compact.cc ('k') | src/heap/remembered-set.cc » ('j') | src/heap/slot-set.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698