blob: d75c675349da208779d8690e0bcea35c5c4d834c [file] [log] [blame]
// Copyright 2020 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "fxjs/gc/heap.h"
#include "third_party/base/ptr_util.h"
namespace {
size_t g_platform_ref_count = 0;
v8::Platform* g_platform = nullptr;
} // namespace
class CFXGC_Platform final : public cppgc::Platform {
public:
CFXGC_Platform() = default;
~CFXGC_Platform() override = default;
cppgc::PageAllocator* GetPageAllocator() override {
return g_platform->GetPageAllocator();
}
double MonotonicallyIncreasingTime() override {
return g_platform->MonotonicallyIncreasingTime();
}
std::shared_ptr<cppgc::TaskRunner> GetForegroundTaskRunner() override {
// V8's default platform creates a new task runner when passed the
// v8::Isolate pointer the first time. For non-default platforms this will
// require getting the appropriate task runner.
return g_platform->GetForegroundTaskRunner(nullptr);
}
std::unique_ptr<cppgc::JobHandle> PostJob(
cppgc::TaskPriority priority,
std::unique_ptr<cppgc::JobTask> job_task) override {
return g_platform->PostJob(priority, std::move(job_task));
}
};
void FXGC_Initialize(v8::Platform* platform) {
if (platform) {
g_platform = platform;
cppgc::InitializeProcess(platform->GetPageAllocator());
}
}
void FXGC_Release() {
if (g_platform && g_platform_ref_count == 0) {
cppgc::ShutdownProcess();
g_platform = nullptr;
}
}
FXGCScopedHeap FXGC_CreateHeap() {
// If XFA is included at compile-time, but JS is disabled at run-time,
// we may still attempt to build a CPDFXFA_Context which will want a
// heap. But we can't make one because JS is disabled.
// TODO(tsepez): Stop the context from even being created.
if (!g_platform)
return nullptr;
++g_platform_ref_count;
auto heap = cppgc::Heap::Create(std::make_shared<CFXGC_Platform>());
return FXGCScopedHeap(heap.release());
}
void FXGCHeapDeleter::operator()(cppgc::Heap* heap) {
if (!heap)
return;
--g_platform_ref_count;
delete heap;
}