// 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;
}
