summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShelley Vohr <shelley.vohr@gmail.com>2021-04-22 20:47:09 +0200
committerShelley Vohr <shelley.vohr@gmail.com>2021-04-30 09:13:21 +0200
commitbdaf51bae79a655e69ed8608008c72e9352ba806 (patch)
tree43b5555f82194a3571c40884b1fe20ff2a964df5
parent746cc88b92c84fc72509d7fd051ee2977822f882 (diff)
downloadnode-new-bdaf51bae79a655e69ed8608008c72e9352ba806.tar.gz
src: allow custom PageAllocator in NodePlatform
For certain embedder use cases there are more complex memory allocation requirements that the default V8 page allocator does not handle. For example, using MAP_JIT when running under a hardened runtime environment on macOS. This allows embedders like Electron to provide their own allocator that does handle these cases. PR-URL: https://github.com/nodejs/node/pull/38362 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Rich Trott <rtrott@gmail.com>
-rw-r--r--src/api/environment.cc10
-rw-r--r--src/node.h3
-rw-r--r--src/node_platform.cc11
-rw-r--r--src/node_platform.h5
4 files changed, 23 insertions, 6 deletions
diff --git a/src/api/environment.cc b/src/api/environment.cc
index 46e3360ef9..3d061d38a5 100644
--- a/src/api/environment.cc
+++ b/src/api/environment.cc
@@ -465,7 +465,8 @@ MultiIsolatePlatform* CreatePlatform(
MultiIsolatePlatform* CreatePlatform(
int thread_pool_size,
v8::TracingController* tracing_controller) {
- return MultiIsolatePlatform::Create(thread_pool_size, tracing_controller)
+ return MultiIsolatePlatform::Create(thread_pool_size,
+ tracing_controller)
.release();
}
@@ -475,8 +476,11 @@ void FreePlatform(MultiIsolatePlatform* platform) {
std::unique_ptr<MultiIsolatePlatform> MultiIsolatePlatform::Create(
int thread_pool_size,
- v8::TracingController* tracing_controller) {
- return std::make_unique<NodePlatform>(thread_pool_size, tracing_controller);
+ v8::TracingController* tracing_controller,
+ v8::PageAllocator* page_allocator) {
+ return std::make_unique<NodePlatform>(thread_pool_size,
+ tracing_controller,
+ page_allocator);
}
MaybeLocal<Object> GetPerContextExports(Local<Context> context) {
diff --git a/src/node.h b/src/node.h
index 4348dfba5b..066c0eadfb 100644
--- a/src/node.h
+++ b/src/node.h
@@ -310,7 +310,8 @@ class NODE_EXTERN MultiIsolatePlatform : public v8::Platform {
static std::unique_ptr<MultiIsolatePlatform> Create(
int thread_pool_size,
- v8::TracingController* tracing_controller = nullptr);
+ v8::TracingController* tracing_controller = nullptr,
+ v8::PageAllocator* page_allocator = nullptr);
};
enum IsolateSettingsFlags {
diff --git a/src/node_platform.cc b/src/node_platform.cc
index eb918bdd55..9787cbb3ed 100644
--- a/src/node_platform.cc
+++ b/src/node_platform.cc
@@ -324,12 +324,17 @@ void PerIsolatePlatformData::DecreaseHandleCount() {
}
NodePlatform::NodePlatform(int thread_pool_size,
- v8::TracingController* tracing_controller) {
+ v8::TracingController* tracing_controller,
+ v8::PageAllocator* page_allocator) {
if (tracing_controller != nullptr) {
tracing_controller_ = tracing_controller;
} else {
tracing_controller_ = new v8::TracingController();
}
+
+ // V8 will default to its built in allocator if none is provided.
+ page_allocator_ = page_allocator;
+
// TODO(addaleax): It's a bit icky that we use global state here, but we can't
// really do anything about it unless V8 starts exposing a way to access the
// current v8::Platform instance.
@@ -550,6 +555,10 @@ Platform::StackTracePrinter NodePlatform::GetStackTracePrinter() {
};
}
+v8::PageAllocator* NodePlatform::GetPageAllocator() {
+ return page_allocator_;
+}
+
template <class T>
TaskQueue<T>::TaskQueue()
: lock_(), tasks_available_(), tasks_drained_(),
diff --git a/src/node_platform.h b/src/node_platform.h
index a7139ebdcc..4a05f3bba5 100644
--- a/src/node_platform.h
+++ b/src/node_platform.h
@@ -138,7 +138,8 @@ class WorkerThreadsTaskRunner {
class NodePlatform : public MultiIsolatePlatform {
public:
NodePlatform(int thread_pool_size,
- v8::TracingController* tracing_controller);
+ v8::TracingController* tracing_controller,
+ v8::PageAllocator* page_allocator = nullptr);
~NodePlatform() override;
void DrainTasks(v8::Isolate* isolate) override;
@@ -170,6 +171,7 @@ class NodePlatform : public MultiIsolatePlatform {
v8::Isolate* isolate) override;
Platform::StackTracePrinter GetStackTracePrinter() override;
+ v8::PageAllocator* GetPageAllocator() override;
private:
IsolatePlatformDelegate* ForIsolate(v8::Isolate* isolate);
@@ -181,6 +183,7 @@ class NodePlatform : public MultiIsolatePlatform {
std::unordered_map<v8::Isolate*, DelegatePair> per_isolate_;
v8::TracingController* tracing_controller_;
+ v8::PageAllocator* page_allocator_;
std::shared_ptr<WorkerThreadsTaskRunner> worker_thread_task_runner_;
bool has_shut_down_ = false;
};