summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/cppgc/object-allocator.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/heap/cppgc/object-allocator.h')
-rw-r--r--deps/v8/src/heap/cppgc/object-allocator.h43
1 files changed, 31 insertions, 12 deletions
diff --git a/deps/v8/src/heap/cppgc/object-allocator.h b/deps/v8/src/heap/cppgc/object-allocator.h
index 77f26ce3b5..82d1441af1 100644
--- a/deps/v8/src/heap/cppgc/object-allocator.h
+++ b/deps/v8/src/heap/cppgc/object-allocator.h
@@ -52,6 +52,7 @@ class V8_EXPORT_PRIVATE ObjectAllocator final : public cppgc::AllocationHandle {
GCInfoIndex gcinfo, CustomSpaceIndex space_index);
void ResetLinearAllocationBuffers();
+ void MarkAllPagesAsYoung();
private:
bool in_disallow_gc_scope() const;
@@ -61,11 +62,21 @@ class V8_EXPORT_PRIVATE ObjectAllocator final : public cppgc::AllocationHandle {
inline static RawHeap::RegularSpaceType GetInitialSpaceIndexForSize(
size_t size);
- inline void* AllocateObjectOnSpace(NormalPageSpace& space, size_t size,
- GCInfoIndex gcinfo);
- inline void* AllocateObjectOnSpace(NormalPageSpace& space, size_t size,
- AlignVal alignment, GCInfoIndex gcinfo);
- void* OutOfLineAllocate(NormalPageSpace&, size_t, AlignVal, GCInfoIndex);
+ inline void* AllocateObjectOnSpace(NormalPageSpace&, size_t, GCInfoIndex);
+ inline void* AllocateObjectOnSpace(NormalPageSpace&, size_t, AlignVal,
+ GCInfoIndex);
+ inline void* OutOfLineAllocate(NormalPageSpace&, size_t, AlignVal,
+ GCInfoIndex);
+
+ // Called from the fast path LAB allocation when the LAB capacity cannot fit
+ // the allocation or a large object is requested. Use out parameter as
+ // `V8_PRESERVE_MOST` cannot handle non-void return values.
+ //
+ // Prefer using `OutOfLineAllocate()`.
+ void V8_PRESERVE_MOST OutOfLineAllocateGCSafePoint(NormalPageSpace&, size_t,
+ AlignVal, GCInfoIndex,
+ void**);
+ // Raw allocation, does not emit safepoint for conservative GC.
void* OutOfLineAllocateImpl(NormalPageSpace&, size_t, AlignVal, GCInfoIndex);
bool TryRefillLinearAllocationBuffer(NormalPageSpace&, size_t);
@@ -135,6 +146,14 @@ RawHeap::RegularSpaceType ObjectAllocator::GetInitialSpaceIndexForSize(
return RawHeap::RegularSpaceType::kNormal4;
}
+void* ObjectAllocator::OutOfLineAllocate(NormalPageSpace& space, size_t size,
+ AlignVal alignment,
+ GCInfoIndex gcinfo) {
+ void* object;
+ OutOfLineAllocateGCSafePoint(space, size, alignment, gcinfo, &object);
+ return object;
+}
+
void* ObjectAllocator::AllocateObjectOnSpace(NormalPageSpace& space,
size_t size, AlignVal alignment,
GCInfoIndex gcinfo) {
@@ -174,13 +193,13 @@ void* ObjectAllocator::AllocateObjectOnSpace(NormalPageSpace& space,
.SetBit<AccessMode::kAtomic>(reinterpret_cast<ConstAddress>(&filler));
lab_allocation_will_succeed = true;
}
- if (lab_allocation_will_succeed) {
- void* object = AllocateObjectOnSpace(space, size, gcinfo);
- DCHECK_NOT_NULL(object);
- DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(object) & kAlignmentMask);
- return object;
+ if (V8_UNLIKELY(!lab_allocation_will_succeed)) {
+ return OutOfLineAllocate(space, size, alignment, gcinfo);
}
- return OutOfLineAllocate(space, size, alignment, gcinfo);
+ void* object = AllocateObjectOnSpace(space, size, gcinfo);
+ DCHECK_NOT_NULL(object);
+ DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(object) & kAlignmentMask);
+ return object;
}
void* ObjectAllocator::AllocateObjectOnSpace(NormalPageSpace& space,
@@ -189,7 +208,7 @@ void* ObjectAllocator::AllocateObjectOnSpace(NormalPageSpace& space,
NormalPageSpace::LinearAllocationBuffer& current_lab =
space.linear_allocation_buffer();
- if (current_lab.size() < size) {
+ if (V8_UNLIKELY(current_lab.size() < size)) {
return OutOfLineAllocate(
space, size, static_cast<AlignVal>(kAllocationGranularity), gcinfo);
}