xref: /aosp_15_r20/external/pdfium/fxjs/gc/heap.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2020 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/heap.h"
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_system.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/heap.h"
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker namespace {
14*3ac0a46fSAndroid Build Coastguard Worker 
15*3ac0a46fSAndroid Build Coastguard Worker size_t g_platform_ref_count = 0;
16*3ac0a46fSAndroid Build Coastguard Worker v8::Platform* g_platform = nullptr;
17*3ac0a46fSAndroid Build Coastguard Worker v8::Isolate* g_isolate = nullptr;
18*3ac0a46fSAndroid Build Coastguard Worker 
19*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
20*3ac0a46fSAndroid Build Coastguard Worker 
21*3ac0a46fSAndroid Build Coastguard Worker // Taken from v8/samples/cppgc/cppgc-for-v8-embedders.cc.
22*3ac0a46fSAndroid Build Coastguard Worker // Adaptper that makes the global v8::Platform compatible with a
23*3ac0a46fSAndroid Build Coastguard Worker // cppgc::Platform.
24*3ac0a46fSAndroid Build Coastguard Worker class CFXGC_Platform final : public cppgc::Platform {
25*3ac0a46fSAndroid Build Coastguard Worker  public:
26*3ac0a46fSAndroid Build Coastguard Worker   CFXGC_Platform() = default;
27*3ac0a46fSAndroid Build Coastguard Worker   ~CFXGC_Platform() override = default;
28*3ac0a46fSAndroid Build Coastguard Worker 
GetPageAllocator()29*3ac0a46fSAndroid Build Coastguard Worker   cppgc::PageAllocator* GetPageAllocator() override {
30*3ac0a46fSAndroid Build Coastguard Worker     return g_platform->GetPageAllocator();
31*3ac0a46fSAndroid Build Coastguard Worker   }
32*3ac0a46fSAndroid Build Coastguard Worker 
MonotonicallyIncreasingTime()33*3ac0a46fSAndroid Build Coastguard Worker   double MonotonicallyIncreasingTime() override {
34*3ac0a46fSAndroid Build Coastguard Worker     return g_platform->MonotonicallyIncreasingTime();
35*3ac0a46fSAndroid Build Coastguard Worker   }
36*3ac0a46fSAndroid Build Coastguard Worker 
GetForegroundTaskRunner()37*3ac0a46fSAndroid Build Coastguard Worker   std::shared_ptr<cppgc::TaskRunner> GetForegroundTaskRunner() override {
38*3ac0a46fSAndroid Build Coastguard Worker     // V8's default platform creates a new task runner when passed the
39*3ac0a46fSAndroid Build Coastguard Worker     // v8::Isolate pointer the first time. For non-default platforms this will
40*3ac0a46fSAndroid Build Coastguard Worker     // require getting the appropriate task runner.
41*3ac0a46fSAndroid Build Coastguard Worker     return g_platform->GetForegroundTaskRunner(g_isolate);
42*3ac0a46fSAndroid Build Coastguard Worker   }
43*3ac0a46fSAndroid Build Coastguard Worker 
PostJob(cppgc::TaskPriority priority,std::unique_ptr<cppgc::JobTask> job_task)44*3ac0a46fSAndroid Build Coastguard Worker   std::unique_ptr<cppgc::JobHandle> PostJob(
45*3ac0a46fSAndroid Build Coastguard Worker       cppgc::TaskPriority priority,
46*3ac0a46fSAndroid Build Coastguard Worker       std::unique_ptr<cppgc::JobTask> job_task) override {
47*3ac0a46fSAndroid Build Coastguard Worker     return g_platform->PostJob(priority, std::move(job_task));
48*3ac0a46fSAndroid Build Coastguard Worker   }
49*3ac0a46fSAndroid Build Coastguard Worker };
50*3ac0a46fSAndroid Build Coastguard Worker 
FXGC_Initialize(v8::Platform * platform,v8::Isolate * isolate)51*3ac0a46fSAndroid Build Coastguard Worker void FXGC_Initialize(v8::Platform* platform, v8::Isolate* isolate) {
52*3ac0a46fSAndroid Build Coastguard Worker   if (platform) {
53*3ac0a46fSAndroid Build Coastguard Worker     DCHECK(!g_platform);
54*3ac0a46fSAndroid Build Coastguard Worker     g_platform = platform;
55*3ac0a46fSAndroid Build Coastguard Worker     g_isolate = isolate;
56*3ac0a46fSAndroid Build Coastguard Worker   }
57*3ac0a46fSAndroid Build Coastguard Worker }
58*3ac0a46fSAndroid Build Coastguard Worker 
FXGC_Release()59*3ac0a46fSAndroid Build Coastguard Worker void FXGC_Release() {
60*3ac0a46fSAndroid Build Coastguard Worker   if (g_platform && g_platform_ref_count == 0) {
61*3ac0a46fSAndroid Build Coastguard Worker     g_platform = nullptr;
62*3ac0a46fSAndroid Build Coastguard Worker     g_isolate = nullptr;
63*3ac0a46fSAndroid Build Coastguard Worker   }
64*3ac0a46fSAndroid Build Coastguard Worker }
65*3ac0a46fSAndroid Build Coastguard Worker 
FXGC_CreateHeap()66*3ac0a46fSAndroid Build Coastguard Worker FXGCScopedHeap FXGC_CreateHeap() {
67*3ac0a46fSAndroid Build Coastguard Worker   // If XFA is included at compile-time, but JS is disabled at run-time,
68*3ac0a46fSAndroid Build Coastguard Worker   // we may still attempt to build a CPDFXFA_Context which will want a
69*3ac0a46fSAndroid Build Coastguard Worker   // heap. But we can't make one because JS is disabled.
70*3ac0a46fSAndroid Build Coastguard Worker   // TODO(tsepez): Stop the context from even being created.
71*3ac0a46fSAndroid Build Coastguard Worker   if (!g_platform)
72*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
73*3ac0a46fSAndroid Build Coastguard Worker 
74*3ac0a46fSAndroid Build Coastguard Worker   ++g_platform_ref_count;
75*3ac0a46fSAndroid Build Coastguard Worker   auto heap = cppgc::Heap::Create(
76*3ac0a46fSAndroid Build Coastguard Worker       std::make_shared<CFXGC_Platform>(),
77*3ac0a46fSAndroid Build Coastguard Worker       cppgc::Heap::HeapOptions{
78*3ac0a46fSAndroid Build Coastguard Worker           {},
79*3ac0a46fSAndroid Build Coastguard Worker           cppgc::Heap::StackSupport::kNoConservativeStackScan,
80*3ac0a46fSAndroid Build Coastguard Worker           cppgc::Heap::MarkingType::kAtomic,
81*3ac0a46fSAndroid Build Coastguard Worker           cppgc::Heap::SweepingType::kIncrementalAndConcurrent,
82*3ac0a46fSAndroid Build Coastguard Worker           {}});
83*3ac0a46fSAndroid Build Coastguard Worker   return FXGCScopedHeap(heap.release());
84*3ac0a46fSAndroid Build Coastguard Worker }
85*3ac0a46fSAndroid Build Coastguard Worker 
FXGC_ForceGarbageCollection(cppgc::Heap * heap)86*3ac0a46fSAndroid Build Coastguard Worker void FXGC_ForceGarbageCollection(cppgc::Heap* heap) {
87*3ac0a46fSAndroid Build Coastguard Worker   heap->ForceGarbageCollectionSlow("FXGC", "ForceGarbageCollection",
88*3ac0a46fSAndroid Build Coastguard Worker                                    cppgc::Heap::StackState::kNoHeapPointers);
89*3ac0a46fSAndroid Build Coastguard Worker }
90*3ac0a46fSAndroid Build Coastguard Worker 
operator ()(cppgc::Heap * heap)91*3ac0a46fSAndroid Build Coastguard Worker void FXGCHeapDeleter::operator()(cppgc::Heap* heap) {
92*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(heap);
93*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(g_platform_ref_count > 0);
94*3ac0a46fSAndroid Build Coastguard Worker   --g_platform_ref_count;
95*3ac0a46fSAndroid Build Coastguard Worker 
96*3ac0a46fSAndroid Build Coastguard Worker   FXGC_ForceGarbageCollection(heap);
97*3ac0a46fSAndroid Build Coastguard Worker   delete heap;
98*3ac0a46fSAndroid Build Coastguard Worker }
99