76c9368593
TracedGlobal integrates with the use case of EmbedderHeapTracer and replaces regular weak Global or Persistent nodes for such cases. This allows to simplify the case for regular weak handles in a sense that they follow regular weak semantics (if the underlying object is otherwise unreachable the weak handle will be reset). TracedGlobal requires slightly different semantics in the sense that it can be required to keep them alive on Scavenge garbage collections because there's a transitive path that is only known when using the EmbedderHeapTracer. TracedGlobal accomodates that use case. TracedGlobal follows move semantics and can thus be used in regular std containers without wrapping data structure. The internal state uses 20% less memory and allows for only iterating those nodes when necessary. The design trades the virtual call when iterating interesting persistents in the GC prologue with calling out through the EmbedderHeapTracer for each node which is also a virtual call. There is one less iteration over the set of handles required though and the design is robust against recursive GCs that mutate the embedder state during the prologue callback. Bug: chromium:923361 Change-Id: Idbacfbe4723cd12af9de21058a4792e51dc4df74 Reviewed-on: https://chromium-review.googlesource.com/c/1425523 Commit-Queue: Michael Lippautz <mlippautz@chromium.org> Reviewed-by: Ulan Degenbaev <ulan@chromium.org> Cr-Commit-Position: refs/heads/master@{#59183}
72 lines
2.3 KiB
C++
72 lines
2.3 KiB
C++
// Copyright 2016 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 HEAP_HEAP_UTILS_H_
|
|
#define HEAP_HEAP_UTILS_H_
|
|
|
|
#include "src/api-inl.h"
|
|
#include "src/heap/heap.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
namespace heap {
|
|
|
|
void SealCurrentObjects(Heap* heap);
|
|
|
|
int FixedArrayLenFromSize(int size);
|
|
|
|
// Fill a page with fixed arrays leaving remainder behind. The function does
|
|
// not create additional fillers and assumes that the space has just been
|
|
// sealed.
|
|
std::vector<Handle<FixedArray>> FillOldSpacePageWithFixedArrays(Heap* heap,
|
|
int remainder);
|
|
|
|
std::vector<Handle<FixedArray>> CreatePadding(
|
|
Heap* heap, int padding_size, PretenureFlag tenure,
|
|
int object_size = kMaxRegularHeapObjectSize);
|
|
|
|
void AllocateAllButNBytes(
|
|
v8::internal::NewSpace* space, int extra_bytes,
|
|
std::vector<Handle<FixedArray>>* out_handles = nullptr);
|
|
|
|
void FillCurrentPage(v8::internal::NewSpace* space,
|
|
std::vector<Handle<FixedArray>>* out_handles = nullptr);
|
|
|
|
// Helper function that simulates a full new-space in the heap.
|
|
bool FillUpOnePage(v8::internal::NewSpace* space,
|
|
std::vector<Handle<FixedArray>>* out_handles = nullptr);
|
|
|
|
void SimulateFullSpace(v8::internal::NewSpace* space,
|
|
std::vector<Handle<FixedArray>>* out_handles = nullptr);
|
|
|
|
// Helper function that simulates many incremental marking steps until
|
|
// marking is completed.
|
|
void SimulateIncrementalMarking(i::Heap* heap, bool force_completion = true);
|
|
|
|
// Helper function that simulates a full old-space in the heap.
|
|
void SimulateFullSpace(v8::internal::PagedSpace* space);
|
|
|
|
void AbandonCurrentlyFreeMemory(PagedSpace* space);
|
|
|
|
void GcAndSweep(Heap* heap, AllocationSpace space);
|
|
|
|
void ForceEvacuationCandidate(Page* page);
|
|
|
|
void InvokeScavenge();
|
|
|
|
void InvokeMarkSweep();
|
|
|
|
template <typename GlobalOrPersistent>
|
|
bool InNewSpace(v8::Isolate* isolate, const GlobalOrPersistent& global) {
|
|
v8::HandleScope scope(isolate);
|
|
auto tmp = global.Get(isolate);
|
|
return i::Heap::InNewSpace(*v8::Utils::OpenHandle(*tmp));
|
|
}
|
|
|
|
} // namespace heap
|
|
} // namespace internal
|
|
} // namespace v8
|
|
|
|
#endif // HEAP_HEAP_UTILS_H_
|