blob: 3bb1777df113f15130b0a693fd94cf1927b1dee1 [file] [log] [blame]
// 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_OFF_THREAD_HEAP_H_
#define V8_HEAP_OFF_THREAD_HEAP_H_
#include <vector>
#include "src/common/globals.h"
#include "src/heap/large-spaces.h"
#include "src/heap/paged-spaces.h"
#include "src/heap/spaces.h"
#include "src/objects/heap-object.h"
namespace v8 {
namespace internal {
class OffThreadTransferHandleStorage;
class V8_EXPORT_PRIVATE OffThreadHeap {
public:
explicit OffThreadHeap(Heap* heap);
~OffThreadHeap();
HeapObject AllocateRaw(int size, AllocationType allocation,
AllocationAlignment alignment = kWordAligned);
void AddToScriptList(Handle<Script> shared);
void OnAllocationEvent(HeapObject obj, int size) {
// TODO(leszeks): Do something here.
}
ReadOnlySpace* read_only_space() const {
// Access the main-thread heap via the spaces.
return space_.heap()->read_only_space();
}
bool Contains(HeapObject obj);
bool ReserveSpace(Heap::Reservation* reservations);
HeapObject CreateFillerObjectAt(Address addr, int size,
ClearFreedMemoryMode clear_memory_mode);
OffThreadTransferHandleStorage* AddTransferHandleStorage(HandleBase handle);
void FinishOffThread();
void Publish(Heap* heap);
private:
friend class DeserializerAllocator;
class StringSlotCollectingVisitor;
struct RelativeSlot {
RelativeSlot() = default;
RelativeSlot(Address object_address, int slot_offset)
: object_address(object_address), slot_offset(slot_offset) {}
Address object_address;
int slot_offset;
};
OffThreadSpace space_;
OffThreadLargeObjectSpace lo_space_;
std::vector<RelativeSlot> string_slots_;
std::vector<Script> script_list_;
std::unique_ptr<OffThreadTransferHandleStorage>
off_thread_transfer_handles_head_;
bool is_finished = false;
};
} // namespace internal
} // namespace v8
#endif // V8_HEAP_OFF_THREAD_HEAP_H_