Skip to content

Commit b1015e0

Browse files
targosrefack
authored andcommitted
deps: V8: cherry-pick 6 commits
Cherry-pick ad49f12. Original commit message: [cleanup] Move Compressed[XXX]Slot definitions to separate header ... and fix header includes to please the respective bot. Drive-by-fix: decompression implementation is now MSVC friendly. Bug: v8:7703, v8:8834 Change-Id: Iaf589138e5bafb32b0d9feab5cf074b71f241a3c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1505579 Commit-Queue: Igor Sheludko <[email protected]> Reviewed-by: Ulan Degenbaev <[email protected]> Cr-Commit-Position: refs/heads/master@{#60074} Refs: v8/v8@ad49f12 Cherry-pick 14f07a8. Original commit message: [ptr-compr] Define kTaggedPayloadOffset correctly on Big Endian smi size is sill 8 bytes when V8_COMPRESS_POINTERS is undefined. Bug: v8:7703 Change-Id: I0d1e757e42e8b1e6b10960420135245e24553175 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1508572 Commit-Queue: Junliang Yan <[email protected]> Auto-Submit: Junliang Yan <[email protected]> Reviewed-by: Igor Sheludko <[email protected]> Cr-Commit-Position: refs/heads/master@{#60097} Refs: v8/v8@14f07a8 Cherry-pick 676014b. Original commit message: [ptr-compr] Fix MSVC build ... which complained about truncating uintptr_t constant to uint32_t. Bug: v8:7703 Change-Id: I6fae2bf1e5de79e6131479b84a8d8aa5b9de909f Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1508672 Reviewed-by: Ulan Degenbaev <[email protected]> Commit-Queue: Igor Sheludko <[email protected]> Cr-Commit-Position: refs/heads/master@{#60100} Refs: v8/v8@676014b Cherry-pick 4e6a1a7. Original commit message: [heap] Clean-up some weak map entries in scavenger This change enables clean-up of weak map entries in the scavenger of the weak map is in the young generation. With this change, the scavenger treats keys in ephemerons as weak instead of strong, but does not implement full ephemeron semantics: Values are treated always as strong, independently of whether the key is live or not. This approach ensures that no value is cleaned up accidentally. After scavenging, all entries with dead keys are removed from weak maps. After that, some values that are not referenced anywhere anymore might still be in the heap, and those can be cleaned up in the next scavenge. What the scavenger does, amounts to one iteration of the fixed-point algorithm required to implement ephemeron semantics. We hope that this is a reasonable trade-off between time spent tracing and cleaned-up entries. This change does not affect weak maps that reside in old space. Bug: v8:8557 Change-Id: Ic5618b3b863ad8c314c87449571150e756fecbf0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1467182 Commit-Queue: Sigurd Schneider <[email protected]> Reviewed-by: Ulan Degenbaev <[email protected]> Cr-Commit-Position: refs/heads/master@{#60101} Refs: v8/v8@4e6a1a7 Cherry-pick afbfd75. Original commit message: [ptr-compr] Fix ptr-compr broken by 4e6a1a75 (https://chromium-review.googlesource.com/c/v8/v8/+/1467182) Bug: v8:7703 Change-Id: Ia6b74b985735af67bde56b30e4a709247eb591be Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1508674 Commit-Queue: Igor Sheludko <[email protected]> Commit-Queue: Ulan Degenbaev <[email protected]> Reviewed-by: Ulan Degenbaev <[email protected]> Cr-Commit-Position: refs/heads/master@{#60102} Refs: v8/v8@afbfd75 Cherry-pick f792eb8. Original commit message: [ptr-compr][arm64] Update pointer compression arm64's implementation Since kTaggedSize got shrinked and we are actually compressing the pointers (as oppposed to zeroing their upper bits), we need to update the arm64 codebase to accommodate this change. Cq-Include-Trybots: luci.v8.try:v8_linux64_arm64_pointer_compression_rel_ng Bug: v8:7703 Change-Id: I890f3ab8c046f47232e80f85830f9ae8f4dbced4 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1499498 Commit-Queue: Santiago Aboy Solanes <[email protected]> Reviewed-by: Igor Sheludko <[email protected]> Reviewed-by: Ross McIlroy <[email protected]> Reviewed-by: Clemens Hammacher <[email protected]> Cr-Commit-Position: refs/heads/master@{#60172} Refs: v8/v8@f792eb8 PR-URL: #26685 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Refael Ackermann <[email protected]>
1 parent 8181811 commit b1015e0

37 files changed

+478
-359
lines changed

common.gypi

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
# Reset this number to 0 on major V8 upgrades.
3939
# Increment by one for each non-official patch applied to deps/v8.
40-
'v8_embedder_string': '-node.9',
40+
'v8_embedder_string': '-node.10',
4141

4242
##### V8 defaults for Node.js #####
4343

deps/v8/BUILD.gn

+2
Original file line numberDiff line numberDiff line change
@@ -2276,6 +2276,8 @@ v8_source_set("v8_base") {
22762276
"src/objects/code.h",
22772277
"src/objects/compilation-cache-inl.h",
22782278
"src/objects/compilation-cache.h",
2279+
"src/objects/compressed-slots-inl.h",
2280+
"src/objects/compressed-slots.h",
22792281
"src/objects/data-handler.h",
22802282
"src/objects/debug-objects-inl.h",
22812283
"src/objects/debug-objects.cc",

deps/v8/src/arm64/macro-assembler-arm64-inl.h

+4
Original file line numberDiff line numberDiff line change
@@ -1060,7 +1060,11 @@ void TurboAssembler::SmiUntag(Register dst, const MemOperand& src) {
10601060
}
10611061
} else {
10621062
DCHECK(SmiValuesAre31Bits());
1063+
#ifdef V8_COMPRESS_POINTERS
1064+
Ldrsw(dst, src);
1065+
#else
10631066
Ldr(dst, src);
1067+
#endif
10641068
SmiUntag(dst);
10651069
}
10661070
}

deps/v8/src/arm64/macro-assembler-arm64.cc

+6-14
Original file line numberDiff line numberDiff line change
@@ -2813,11 +2813,7 @@ void TurboAssembler::StoreTaggedField(const Register& value,
28132813
const MemOperand& dst_field_operand) {
28142814
#ifdef V8_COMPRESS_POINTERS
28152815
RecordComment("[ StoreTagged");
2816-
// Use temporary register to zero out and don't trash value register
2817-
UseScratchRegisterScope temps(this);
2818-
Register compressed_value = temps.AcquireX();
2819-
Uxtw(compressed_value, value);
2820-
Str(compressed_value, dst_field_operand);
2816+
Str(value.W(), dst_field_operand);
28212817
RecordComment("]");
28222818
#else
28232819
Str(value, dst_field_operand);
@@ -2827,27 +2823,23 @@ void TurboAssembler::StoreTaggedField(const Register& value,
28272823
void TurboAssembler::DecompressTaggedSigned(const Register& destination,
28282824
const MemOperand& field_operand) {
28292825
RecordComment("[ DecompressTaggedSigned");
2830-
// TODO(solanes): use Ldrsw instead of Ldr,SXTW once kTaggedSize is shrinked
2831-
Ldr(destination, field_operand);
2832-
Sxtw(destination, destination);
2826+
Ldrsw(destination, field_operand);
28332827
RecordComment("]");
28342828
}
28352829

28362830
void TurboAssembler::DecompressTaggedPointer(const Register& destination,
28372831
const MemOperand& field_operand) {
28382832
RecordComment("[ DecompressTaggedPointer");
2839-
// TODO(solanes): use Ldrsw instead of Ldr,SXTW once kTaggedSize is shrinked
2840-
Ldr(destination, field_operand);
2841-
Add(destination, kRootRegister, Operand(destination, SXTW));
2833+
Ldrsw(destination, field_operand);
2834+
Add(destination, kRootRegister, destination);
28422835
RecordComment("]");
28432836
}
28442837

28452838
void TurboAssembler::DecompressAnyTagged(const Register& destination,
28462839
const MemOperand& field_operand) {
28472840
RecordComment("[ DecompressAnyTagged");
28482841
UseScratchRegisterScope temps(this);
2849-
// TODO(solanes): use Ldrsw instead of Ldr,SXTW once kTaggedSize is shrinked
2850-
Ldr(destination, field_operand);
2842+
Ldrsw(destination, field_operand);
28512843
// Branchlessly compute |masked_root|:
28522844
// masked_root = HAS_SMI_TAG(destination) ? 0 : kRootRegister;
28532845
STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0));
@@ -2857,7 +2849,7 @@ void TurboAssembler::DecompressAnyTagged(const Register& destination,
28572849
And(masked_root, masked_root, kRootRegister);
28582850
// Now this add operation will either leave the value unchanged if it is a smi
28592851
// or add the isolate root if it is a heap object.
2860-
Add(destination, masked_root, Operand(destination, SXTW));
2852+
Add(destination, masked_root, destination);
28612853
RecordComment("]");
28622854
}
28632855

deps/v8/src/base/macros.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ V8_INLINE A implicit_cast(A x) {
318318
#define V8PRIdPTR V8_PTR_PREFIX "d"
319319
#define V8PRIuPTR V8_PTR_PREFIX "u"
320320

321-
#ifdef V8_TARGET_ARCH_64_BIT
321+
#if V8_TARGET_ARCH_64_BIT
322322
#define V8_PTR_HEX_DIGITS 12
323323
#define V8PRIxPTR_FMT "0x%012" V8PRIxPTR
324324
#else

deps/v8/src/bootstrapper.h

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include "src/heap/factory.h"
99
#include "src/objects/fixed-array.h"
1010
#include "src/objects/shared-function-info.h"
11-
#include "src/objects/slots.h"
1211
#include "src/snapshot/natives.h"
1312
#include "src/visitors.h"
1413

deps/v8/src/builtins/arm64/builtins-arm64.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -2555,7 +2555,7 @@ void Generate_PushBoundArguments(MacroAssembler* masm) {
25552555
__ SlotAddress(copy_to, argc);
25562556
__ Add(argc, argc,
25572557
bound_argc); // Update argc to include bound arguments.
2558-
__ Lsl(counter, bound_argc, kSystemPointerSizeLog2);
2558+
__ Lsl(counter, bound_argc, kTaggedSizeLog2);
25592559
__ Bind(&loop);
25602560
__ Sub(counter, counter, kTaggedSize);
25612561
__ LoadAnyTaggedField(scratch, MemOperand(bound_argv, counter));

deps/v8/src/heap/heap-write-barrier-inl.h

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// elsewhere.
1616
#include "src/isolate.h"
1717
#include "src/objects/code.h"
18+
#include "src/objects/compressed-slots-inl.h"
1819
#include "src/objects/fixed-array.h"
1920
#include "src/objects/heap-object.h"
2021
#include "src/objects/maybe-object-inl.h"

deps/v8/src/heap/heap.h

+14
Original file line numberDiff line numberDiff line change
@@ -2347,6 +2347,20 @@ class HeapObjectAllocationTracker {
23472347
virtual ~HeapObjectAllocationTracker() = default;
23482348
};
23492349

2350+
template <typename T>
2351+
T ForwardingAddress(T heap_obj) {
2352+
MapWord map_word = heap_obj->map_word();
2353+
2354+
if (map_word.IsForwardingAddress()) {
2355+
return T::cast(map_word.ToForwardingAddress());
2356+
} else if (Heap::InFromPage(heap_obj)) {
2357+
return T();
2358+
} else {
2359+
// TODO(ulan): Support minor mark-compactor here.
2360+
return heap_obj;
2361+
}
2362+
}
2363+
23502364
} // namespace internal
23512365
} // namespace v8
23522366

deps/v8/src/heap/incremental-marking.cc

-16
Original file line numberDiff line numberDiff line change
@@ -609,22 +609,6 @@ void IncrementalMarking::UpdateMarkingWorklistAfterScavenge() {
609609
UpdateWeakReferencesAfterScavenge();
610610
}
611611

612-
namespace {
613-
template <typename T>
614-
T ForwardingAddress(T heap_obj) {
615-
MapWord map_word = heap_obj->map_word();
616-
617-
if (map_word.IsForwardingAddress()) {
618-
return T::cast(map_word.ToForwardingAddress());
619-
} else if (Heap::InFromPage(heap_obj)) {
620-
return T();
621-
} else {
622-
// TODO(ulan): Support minor mark-compactor here.
623-
return heap_obj;
624-
}
625-
}
626-
} // namespace
627-
628612
void IncrementalMarking::UpdateWeakReferencesAfterScavenge() {
629613
weak_objects_->weak_references.Update(
630614
[](std::pair<HeapObject, HeapObjectSlot> slot_in,

deps/v8/src/heap/scavenger-inl.h

+15
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,21 @@ void ScavengeVisitor::VisitPointersImpl(HeapObject host, TSlot start,
480480
}
481481
}
482482

483+
int ScavengeVisitor::VisitEphemeronHashTable(Map map,
484+
EphemeronHashTable table) {
485+
// Register table with the scavenger, so it can take care of the weak keys
486+
// later. This allows to only iterate the tables' values, which are treated
487+
// as strong independetly of whether the key is live.
488+
scavenger_->AddEphemeronHashTable(table);
489+
for (int i = 0; i < table->Capacity(); i++) {
490+
ObjectSlot value_slot =
491+
table->RawFieldOfElementAt(EphemeronHashTable::EntryToValueIndex(i));
492+
VisitPointer(table, value_slot);
493+
}
494+
495+
return table->SizeFromMap(map);
496+
}
497+
483498
} // namespace internal
484499
} // namespace v8
485500

deps/v8/src/heap/scavenger.cc

+57-9
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,25 @@ class IterateAndScavengePromotedObjectsVisitor final : public ObjectVisitor {
151151
const bool record_slots_;
152152
};
153153

154-
static bool IsUnscavengedHeapObject(Heap* heap, FullObjectSlot p) {
155-
return Heap::InFromPage(*p) &&
156-
!HeapObject::cast(*p)->map_word().IsForwardingAddress();
154+
namespace {
155+
156+
V8_INLINE bool IsUnscavengedHeapObject(Heap* heap, Object object) {
157+
return Heap::InFromPage(object) &&
158+
!HeapObject::cast(object)->map_word().IsForwardingAddress();
159+
}
160+
161+
// Same as IsUnscavengedHeapObject() above but specialized for HeapObjects.
162+
V8_INLINE bool IsUnscavengedHeapObject(Heap* heap, HeapObject heap_object) {
163+
return Heap::InFromPage(heap_object) &&
164+
!heap_object->map_word().IsForwardingAddress();
165+
}
166+
167+
bool IsUnscavengedHeapObjectSlot(Heap* heap, FullObjectSlot p) {
168+
return IsUnscavengedHeapObject(heap, *p);
157169
}
158170

171+
} // namespace
172+
159173
class ScavengeWeakObjectRetainer : public WeakObjectRetainer {
160174
public:
161175
Object RetainAs(Object object) override {
@@ -185,9 +199,10 @@ void ScavengerCollector::CollectGarbage() {
185199
OneshotBarrier barrier(base::TimeDelta::FromMilliseconds(kMaxWaitTimeMs));
186200
Scavenger::CopiedList copied_list(num_scavenge_tasks);
187201
Scavenger::PromotionList promotion_list(num_scavenge_tasks);
202+
EphemeronTableList ephemeron_table_list(num_scavenge_tasks);
188203
for (int i = 0; i < num_scavenge_tasks; i++) {
189204
scavengers[i] = new Scavenger(this, heap_, is_logging, &copied_list,
190-
&promotion_list, i);
205+
&promotion_list, &ephemeron_table_list, i);
191206
job.AddTask(new ScavengingTask(heap_, scavengers[i], &barrier));
192207
}
193208

@@ -235,7 +250,7 @@ void ScavengerCollector::CollectGarbage() {
235250
TRACE_GC(heap_->tracer(),
236251
GCTracer::Scope::SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_PROCESS);
237252
isolate_->global_handles()->MarkYoungWeakUnmodifiedObjectsPending(
238-
&IsUnscavengedHeapObject);
253+
&IsUnscavengedHeapObjectSlot);
239254
isolate_->global_handles()->IterateYoungWeakUnmodifiedRootsForFinalizers(
240255
&root_scavenge_visitor);
241256
scavengers[kMainThreadId]->Process();
@@ -244,7 +259,7 @@ void ScavengerCollector::CollectGarbage() {
244259
DCHECK(promotion_list.IsEmpty());
245260
isolate_->global_handles()
246261
->IterateYoungWeakUnmodifiedRootsForPhantomHandles(
247-
&root_scavenge_visitor, &IsUnscavengedHeapObject);
262+
&root_scavenge_visitor, &IsUnscavengedHeapObjectSlot);
248263
}
249264

250265
{
@@ -280,8 +295,7 @@ void ScavengerCollector::CollectGarbage() {
280295
}
281296
}
282297

283-
ScavengeWeakObjectRetainer weak_object_retainer;
284-
heap_->ProcessYoungWeakReferences(&weak_object_retainer);
298+
ProcessWeakReferences(&ephemeron_table_list);
285299

286300
// Set age mark.
287301
heap_->new_space_->set_age_mark(heap_->new_space()->top());
@@ -349,11 +363,12 @@ int ScavengerCollector::NumberOfScavengeTasks() {
349363

350364
Scavenger::Scavenger(ScavengerCollector* collector, Heap* heap, bool is_logging,
351365
CopiedList* copied_list, PromotionList* promotion_list,
352-
int task_id)
366+
EphemeronTableList* ephemeron_table_list, int task_id)
353367
: collector_(collector),
354368
heap_(heap),
355369
promotion_list_(promotion_list, task_id),
356370
copied_list_(copied_list, task_id),
371+
ephemeron_table_list_(ephemeron_table_list, task_id),
357372
local_pretenuring_feedback_(kInitialLocalPretenuringFeedbackCapacity),
358373
copied_size_(0),
359374
promoted_size_(0),
@@ -440,12 +455,45 @@ void Scavenger::Process(OneshotBarrier* barrier) {
440455
} while (!done);
441456
}
442457

458+
void ScavengerCollector::ProcessWeakReferences(
459+
EphemeronTableList* ephemeron_table_list) {
460+
ScavengeWeakObjectRetainer weak_object_retainer;
461+
heap_->ProcessYoungWeakReferences(&weak_object_retainer);
462+
ClearYoungEphemerons(ephemeron_table_list);
463+
}
464+
465+
// Clears ephemerons contained in {EphemeronHashTable}s in young generation.
466+
void ScavengerCollector::ClearYoungEphemerons(
467+
EphemeronTableList* ephemeron_table_list) {
468+
ephemeron_table_list->Iterate([this](EphemeronHashTable table) {
469+
for (int i = 0; i < table->Capacity(); i++) {
470+
ObjectSlot key_slot =
471+
table->RawFieldOfElementAt(EphemeronHashTable::EntryToIndex(i));
472+
Object key = *key_slot;
473+
if (key->IsHeapObject()) {
474+
if (IsUnscavengedHeapObject(heap_, HeapObject::cast(key))) {
475+
table->RemoveEntry(i);
476+
} else {
477+
HeapObject forwarded = ForwardingAddress(HeapObject::cast(key));
478+
HeapObjectReference::Update(HeapObjectSlot(key_slot), forwarded);
479+
}
480+
}
481+
}
482+
});
483+
ephemeron_table_list->Clear();
484+
}
485+
443486
void Scavenger::Finalize() {
444487
heap()->MergeAllocationSitePretenuringFeedback(local_pretenuring_feedback_);
445488
heap()->IncrementSemiSpaceCopiedObjectSize(copied_size_);
446489
heap()->IncrementPromotedObjectsSize(promoted_size_);
447490
collector_->MergeSurvivingNewLargeObjects(surviving_new_large_objects_);
448491
allocator_.Finalize();
492+
ephemeron_table_list_.FlushToGlobal();
493+
}
494+
495+
void Scavenger::AddEphemeronHashTable(EphemeronHashTable table) {
496+
ephemeron_table_list_.Push(table);
449497
}
450498

451499
void RootScavengeVisitor::VisitRootPointer(Root root, const char* description,

deps/v8/src/heap/scavenger.h

+11-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ using SurvivingNewLargeObjectsMap =
2727
std::unordered_map<HeapObject, Map, Object::Hasher>;
2828
using SurvivingNewLargeObjectMapEntry = std::pair<HeapObject, Map>;
2929

30+
constexpr int kEphemeronTableListSegmentSize = 128;
31+
using EphemeronTableList =
32+
Worklist<EphemeronHashTable, kEphemeronTableListSegmentSize>;
33+
3034
class ScavengerCollector {
3135
public:
3236
static const int kMaxScavengerTasks = 8;
@@ -42,6 +46,8 @@ class ScavengerCollector {
4246

4347
int NumberOfScavengeTasks();
4448

49+
void ProcessWeakReferences(EphemeronTableList* ephemeron_table_list);
50+
void ClearYoungEphemerons(EphemeronTableList* ephemeron_table_list);
4551
void HandleSurvivingNewLargeObjects();
4652

4753
Isolate* const isolate_;
@@ -109,10 +115,9 @@ class Scavenger {
109115
static const int kCopiedListSegmentSize = 256;
110116

111117
using CopiedList = Worklist<ObjectAndSize, kCopiedListSegmentSize>;
112-
113118
Scavenger(ScavengerCollector* collector, Heap* heap, bool is_logging,
114119
CopiedList* copied_list, PromotionList* promotion_list,
115-
int task_id);
120+
EphemeronTableList* ephemeron_table_list, int task_id);
116121

117122
// Entry point for scavenging an old generation page. For scavenging single
118123
// objects see RootScavengingVisitor and ScavengeVisitor below.
@@ -125,6 +130,8 @@ class Scavenger {
125130
// Finalize the Scavenger. Needs to be called from the main thread.
126131
void Finalize();
127132

133+
void AddEphemeronHashTable(EphemeronHashTable table);
134+
128135
size_t bytes_copied() const { return copied_size_; }
129136
size_t bytes_promoted() const { return promoted_size_; }
130137

@@ -199,6 +206,7 @@ class Scavenger {
199206
Heap* const heap_;
200207
PromotionList::View promotion_list_;
201208
CopiedList::View copied_list_;
209+
EphemeronTableList::View ephemeron_table_list_;
202210
Heap::PretenuringFeedbackMap local_pretenuring_feedback_;
203211
size_t copied_size_;
204212
size_t promoted_size_;
@@ -242,6 +250,7 @@ class ScavengeVisitor final : public NewSpaceVisitor<ScavengeVisitor> {
242250

243251
V8_INLINE void VisitCodeTarget(Code host, RelocInfo* rinfo) final;
244252
V8_INLINE void VisitEmbeddedPointer(Code host, RelocInfo* rinfo) final;
253+
V8_INLINE int VisitEphemeronHashTable(Map map, EphemeronHashTable object);
245254

246255
private:
247256
template <typename TSlot>

deps/v8/src/heap/slot-set.h

+1-4
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,10 @@
1111
#include "src/allocation.h"
1212
#include "src/base/atomic-utils.h"
1313
#include "src/base/bits.h"
14+
#include "src/objects/compressed-slots.h"
1415
#include "src/objects/slots.h"
1516
#include "src/utils.h"
1617

17-
#ifdef V8_COMPRESS_POINTERS
18-
#include "src/ptr-compr.h"
19-
#endif
20-
2118
namespace v8 {
2219
namespace internal {
2320

deps/v8/src/heap/worklist.h

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class Worklist {
5151
return worklist_->LocalPushSegmentSize(task_id_);
5252
}
5353

54+
void FlushToGlobal() { worklist_->FlushToGlobal(task_id_); }
55+
5456
private:
5557
Worklist<EntryType, SEGMENT_SIZE>* worklist_;
5658
int task_id_;

0 commit comments

Comments
 (0)