blob: cee5c09b3d555f5fe6771ac94af644113b7e9ef8 [file] [log] [blame]
// Copyright 2015 The Chromium 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 BlinkGC_h
#define BlinkGC_h
// BlinkGC.h is a file that defines common things used by Blink GC.
#include "platform/PlatformExport.h"
#include "platform/wtf/Allocator.h"
#define PRINT_HEAP_STATS 0 // Enable this macro to print heap stats to stderr.
namespace blink {
class MarkingVisitor;
class Visitor;
using Address = uint8_t*;
using FinalizationCallback = void (*)(void*);
using VisitorCallback = void (*)(Visitor*, void*);
using MarkingVisitorCallback = void (*)(MarkingVisitor*, void*);
using TraceCallback = VisitorCallback;
using WeakCallback = VisitorCallback;
using EphemeronCallback = VisitorCallback;
// Simple alias to avoid heap compaction type signatures turning into
// a sea of generic |void*|s.
using MovableReference = void*;
// Heap compaction supports registering callbacks that are to be invoked
// when an object is moved during compaction. This is to support internal
// location fixups that need to happen as a result.
//
// i.e., when the object residing at |from| is moved to |to| by the compaction
// pass, invoke the callback to adjust any internal references that now need
// to be |to|-relative.
using MovingObjectCallback = void (*)(void* callback_data,
MovableReference from,
MovableReference to,
size_t);
// List of typed arenas. The list is used to generate the implementation
// of typed arena related methods.
//
// To create a new typed arena add a H(<ClassName>) to the
// FOR_EACH_TYPED_ARENA macro below.
#define FOR_EACH_TYPED_ARENA(H) \
H(Node) \
H(CSSValue)
#define TypedArenaEnumName(Type) k##Type##ArenaIndex,
class PLATFORM_EXPORT BlinkGC final {
STATIC_ONLY(BlinkGC);
public:
// When garbage collecting we need to know whether or not there
// can be pointers to Blink GC managed objects on the stack for
// each thread. When threads reach a safe point they record
// whether or not they have pointers on the stack.
enum StackState { kNoHeapPointersOnStack, kHeapPointersOnStack };
enum GCType {
// Both of the marking task and the sweeping task run in
// ThreadHeap::collectGarbage().
kGCWithSweep,
// Only the marking task runs in ThreadHeap::collectGarbage().
// The sweeping task is split into chunks and scheduled lazily.
kGCWithoutSweep,
// Only the marking task runs just to take a heap snapshot.
// The sweeping task doesn't run. The marks added in the marking task
// are just cleared.
kTakeSnapshot,
};
enum GCReason {
kIdleGC,
kPreciseGC,
kConservativeGC,
kForcedGC,
kMemoryPressureGC,
kPageNavigationGC,
kThreadTerminationGC,
kLastGCReason = kThreadTerminationGC,
};
enum ArenaIndices {
kEagerSweepArenaIndex = 0,
kNormalPage1ArenaIndex,
kNormalPage2ArenaIndex,
kNormalPage3ArenaIndex,
kNormalPage4ArenaIndex,
kVector1ArenaIndex,
kVector2ArenaIndex,
kVector3ArenaIndex,
kVector4ArenaIndex,
kInlineVectorArenaIndex,
kHashTableArenaIndex,
FOR_EACH_TYPED_ARENA(TypedArenaEnumName) kLargeObjectArenaIndex,
// Values used for iteration of heap segments.
kNumberOfArenas,
};
enum V8GCType {
kV8MinorGC,
kV8MajorGC,
};
};
} // namespace blink
#endif // BlinkGC_h