| // Copyright 2020 the V8 project authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef V8_HEAP_CONCURRENT_ALLOCATOR_H_ | 
 | #define V8_HEAP_CONCURRENT_ALLOCATOR_H_ | 
 |  | 
 | #include "src/common/globals.h" | 
 | #include "src/heap/heap.h" | 
 | #include "src/heap/spaces.h" | 
 | #include "src/tasks/cancelable-task.h" | 
 |  | 
 | namespace v8 { | 
 | namespace internal { | 
 |  | 
 | class LocalHeap; | 
 |  | 
 | class StressConcurrentAllocatorTask : public CancelableTask { | 
 |  public: | 
 |   explicit StressConcurrentAllocatorTask(Isolate* isolate) | 
 |       : CancelableTask(isolate), isolate_(isolate) {} | 
 |  | 
 |   void RunInternal() override; | 
 |  | 
 |   // Schedules task on background thread | 
 |   static void Schedule(Isolate* isolate); | 
 |  | 
 |  private: | 
 |   Isolate* isolate_; | 
 | }; | 
 |  | 
 | // Concurrent allocator for allocation from background threads/tasks. | 
 | // Allocations are served from a TLAB if possible. | 
 | class ConcurrentAllocator { | 
 |  public: | 
 |   static const int kLabSize = 4 * KB; | 
 |   static const int kMaxLabSize = 32 * KB; | 
 |   static const int kMaxLabObjectSize = 2 * KB; | 
 |  | 
 |   explicit ConcurrentAllocator(LocalHeap* local_heap, PagedSpace* space) | 
 |       : local_heap_(local_heap), | 
 |         space_(space), | 
 |         lab_(LocalAllocationBuffer::InvalidBuffer()) {} | 
 |  | 
 |   inline AllocationResult AllocateRaw(int object_size, | 
 |                                       AllocationAlignment alignment, | 
 |                                       AllocationOrigin origin); | 
 |  | 
 |   void FreeLinearAllocationArea(); | 
 |   void MakeLinearAllocationAreaIterable(); | 
 |   void MarkLinearAllocationAreaBlack(); | 
 |   void UnmarkLinearAllocationArea(); | 
 |  | 
 |  private: | 
 |   V8_EXPORT_PRIVATE AllocationResult AllocateInLabSlow( | 
 |       int object_size, AllocationAlignment alignment, AllocationOrigin origin); | 
 |   bool EnsureLab(AllocationOrigin origin); | 
 |  | 
 |   inline AllocationResult AllocateInLab(int object_size, | 
 |                                         AllocationAlignment alignment, | 
 |                                         AllocationOrigin origin); | 
 |  | 
 |   V8_EXPORT_PRIVATE AllocationResult AllocateOutsideLab( | 
 |       int object_size, AllocationAlignment alignment, AllocationOrigin origin); | 
 |  | 
 |   LocalHeap* const local_heap_; | 
 |   PagedSpace* const space_; | 
 |   LocalAllocationBuffer lab_; | 
 | }; | 
 |  | 
 | }  // namespace internal | 
 | }  // namespace v8 | 
 |  | 
 | #endif  // V8_HEAP_CONCURRENT_ALLOCATOR_H_ |