#ifndef GIN_PUBLIC_ISOLATE_HOLDER_H_
#define GIN_PUBLIC_ISOLATE_HOLDER_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "gin/gin_export.h"
#include "gin/public/v8_idle_task_runner.h"
#include "v8/include/v8-array-buffer.h"
#include "v8/include/v8-callbacks.h"
#include "v8/include/v8-forward.h"
#include "v8/include/v8-isolate.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace v8 {
class SnapshotCreator;
}
namespace gin {
class PerIsolateData;
class V8IsolateMemoryDumpProvider;
class GIN_EXPORT IsolateHolder {
public:
enum ScriptMode {
kNonStrictMode,
kStrictMode
};
enum AccessMode {
kSingleThread,
kUseLocker
};
enum AllowAtomicsWaitMode {
kDisallowAtomicsWait,
kAllowAtomicsWait
};
enum class IsolateCreationMode {
kNormal,
kCreateSnapshot,
};
enum class IsolateType {
kBlinkMainThread,
kBlinkWorkerThread,
kTest,
kUtility
};
IsolateHolder(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
IsolateType isolate_type);
IsolateHolder(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
AccessMode access_mode,
IsolateType isolate_type);
IsolateHolder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
AccessMode access_mode,
AllowAtomicsWaitMode atomics_wait_mode,
IsolateType isolate_type,
IsolateCreationMode isolate_creation_mode = IsolateCreationMode::kNormal,
v8::CreateHistogramCallback create_histogram_callback = nullptr,
v8::AddHistogramSampleCallback add_histogram_sample_callback = nullptr);
IsolateHolder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
AccessMode access_mode,
IsolateType isolate_type,
std::unique_ptr<v8::Isolate::CreateParams> params,
IsolateCreationMode isolate_creation_mode = IsolateCreationMode::kNormal);
IsolateHolder(const IsolateHolder&) = delete;
IsolateHolder& operator=(const IsolateHolder&) = delete;
~IsolateHolder();
static void Initialize(ScriptMode mode,
v8::ArrayBuffer::Allocator* allocator,
const intptr_t* reference_table = nullptr,
const std::string js_command_line_flags = {},
v8::FatalErrorCallback fatal_error_callback = nullptr,
v8::OOMErrorCallback oom_error_callback = nullptr);
static bool Initialized();
static std::unique_ptr<v8::Isolate::CreateParams> getDefaultIsolateParams();
v8::Isolate* isolate() { return isolate_; }
AccessMode access_mode() const { return access_mode_; }
IsolateType isolate_type() const { return isolate_type_; }
v8::SnapshotCreator* snapshot_creator() const {
return snapshot_creator_.get();
}
void EnableIdleTasks(std::unique_ptr<V8IdleTaskRunner> idle_task_runner);
V8IsolateMemoryDumpProvider* isolate_memory_dump_provider_for_testing()
const {
return isolate_memory_dump_provider_.get();
}
private:
void SetUp(scoped_refptr<base::SingleThreadTaskRunner> task_runner);
std::unique_ptr<v8::SnapshotCreator> snapshot_creator_;
raw_ptr<v8::Isolate, DanglingUntriaged> isolate_;
std::unique_ptr<PerIsolateData> isolate_data_;
std::unique_ptr<V8IsolateMemoryDumpProvider> isolate_memory_dump_provider_;
AccessMode access_mode_;
IsolateType isolate_type_;
};
}
#endif