mirror of https://github.com/nodejs/node.git
deps: V8: backport 4bf051d536a1
Original commit message:
[api] Add Context::GetMicrotaskQueue method
Add a method that returns the microtask queue that is being used
by the `v8::Context`.
This is helpful in non-monolithic embedders like Node.js, which
accept Contexts created by its own embedders like Electron, or
for native Node.js addons. In particular, it enables:
1. Making sure that “nested” `Context`s use the correct microtask
queue, i.e. the one from the outer Context.
2. Enqueueing microtasks into the correct microtask queue.
Previously, these things only worked when the microtask queue for
a given Context was the Isolate’s default queue.
As an alternative, I considered adding a way to make new `Context`s
inherit the queue from the `Context` that was entered at the time
of their creation, but that seemed a bit more “magic”, less flexible,
and didn’t take care of concern 2 listed above.
Change-Id: I15ed796df90f23c97a545a8e1b30a3bf4a5c4320
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2579914
Reviewed-by: Toon Verwaest <verwaest@chromium.org>
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/master@{#71710}
Refs: 4bf051d536
PR-URL: https://github.com/nodejs/node/pull/36482
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
pull/36509/head
parent
d313bf7d47
commit
a91a95f820
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
# Reset this number to 0 on major V8 upgrades.
|
# Reset this number to 0 on major V8 upgrades.
|
||||||
# Increment by one for each non-official patch applied to deps/v8.
|
# Increment by one for each non-official patch applied to deps/v8.
|
||||||
'v8_embedder_string': '-node.20',
|
'v8_embedder_string': '-node.21',
|
||||||
|
|
||||||
##### V8 defaults for Node.js #####
|
##### V8 defaults for Node.js #####
|
||||||
|
|
||||||
|
|
|
@ -10417,9 +10417,12 @@ class V8_EXPORT Context {
|
||||||
*/
|
*/
|
||||||
void Exit();
|
void Exit();
|
||||||
|
|
||||||
/** Returns an isolate associated with a current context. */
|
/** Returns the isolate associated with a current context. */
|
||||||
Isolate* GetIsolate();
|
Isolate* GetIsolate();
|
||||||
|
|
||||||
|
/** Returns the microtask queue associated with a current context. */
|
||||||
|
MicrotaskQueue* GetMicrotaskQueue();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The field at kDebugIdIndex used to be reserved for the inspector.
|
* The field at kDebugIdIndex used to be reserved for the inspector.
|
||||||
* It now serves no purpose.
|
* It now serves no purpose.
|
||||||
|
|
|
@ -6118,6 +6118,12 @@ v8::Isolate* Context::GetIsolate() {
|
||||||
return reinterpret_cast<Isolate*>(env->GetIsolate());
|
return reinterpret_cast<Isolate*>(env->GetIsolate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v8::MicrotaskQueue* Context::GetMicrotaskQueue() {
|
||||||
|
i::Handle<i::Context> env = Utils::OpenHandle(this);
|
||||||
|
CHECK(env->IsNativeContext());
|
||||||
|
return i::Handle<i::NativeContext>::cast(env)->microtask_queue();
|
||||||
|
}
|
||||||
|
|
||||||
v8::Local<v8::Object> Context::Global() {
|
v8::Local<v8::Object> Context::Global() {
|
||||||
i::Handle<i::Context> context = Utils::OpenHandle(this);
|
i::Handle<i::Context> context = Utils::OpenHandle(this);
|
||||||
i::Isolate* isolate = context->GetIsolate();
|
i::Isolate* isolate = context->GetIsolate();
|
||||||
|
|
|
@ -28348,3 +28348,13 @@ TEST(TriggerThreadSafeMetricsEvent) {
|
||||||
CHECK_EQ(recorder->count_, 1); // Increased.
|
CHECK_EQ(recorder->count_, 1); // Increased.
|
||||||
CHECK_EQ(recorder->module_count_, 42);
|
CHECK_EQ(recorder->module_count_, 42);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
THREADED_TEST(MicrotaskQueueOfContext) {
|
||||||
|
auto microtask_queue = v8::MicrotaskQueue::New(CcTest::isolate());
|
||||||
|
v8::HandleScope scope(CcTest::isolate());
|
||||||
|
v8::Local<Context> context = Context::New(
|
||||||
|
CcTest::isolate(), nullptr, v8::MaybeLocal<ObjectTemplate>(),
|
||||||
|
v8::MaybeLocal<Value>(), v8::DeserializeInternalFieldsCallback(),
|
||||||
|
microtask_queue.get());
|
||||||
|
CHECK_EQ(context->GetMicrotaskQueue(), microtask_queue.get());
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue