Skip to content

Commit d456aa0

Browse files
addaleaxMylesBorins
authored andcommitted
src: unregister Isolate with platform before disposing
I previously thought the order of these calls was no longer relevant. I was wrong. This commit undoes the changes from 312c02d, adds a comment explaining why I was wrong, and flips the order of the calls elsewhere for consistency, the latter having been the goal of 312c02d. Fixes: #30846 Refs: #30181 PR-URL: #30909 Reviewed-By: Shelley Vohr <codebytere@gmail.com> Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: David Carlier <devnexen@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
1 parent 0c18c49 commit d456aa0

File tree

4 files changed

+9
-3
lines changed

4 files changed

+9
-3
lines changed

src/node.h

+1
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ class NODE_EXTERN MultiIsolatePlatform : public v8::Platform {
286286

287287
// This function may only be called once per `Isolate`, and discard any
288288
// pending delayed tasks scheduled for that isolate.
289+
// This needs to be called right before calling `Isolate::Dispose()`.
289290
virtual void UnregisterIsolate(v8::Isolate* isolate) = 0;
290291

291292
// The platform should call the passed function once all state associated

src/node_main_instance.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ NodeMainInstance::~NodeMainInstance() {
9999
if (!owns_isolate_) {
100100
return;
101101
}
102-
isolate_->Dispose();
103102
platform_->UnregisterIsolate(isolate_);
103+
isolate_->Dispose();
104104
}
105105

106106
int NodeMainInstance::Run() {

src/node_worker.cc

+6-1
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,13 @@ class WorkerThreadData {
190190
*static_cast<bool*>(data) = true;
191191
}, &platform_finished);
192192

193-
isolate->Dispose();
193+
// The order of these calls is important; if the Isolate is first disposed
194+
// and then unregistered, there is a race condition window in which no
195+
// new Isolate at the same address can successfully be registered with
196+
// the platform.
197+
// (Refs: https://github.com/nodejs/node/issues/30846)
194198
w_->platform_->UnregisterIsolate(isolate);
199+
isolate->Dispose();
195200

196201
// Wait until the platform has cleaned up all relevant resources.
197202
while (!platform_finished)

test/cctest/node_test_fixture.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ class NodeTestFixture : public ::testing::Test {
107107
void TearDown() override {
108108
platform->DrainTasks(isolate_);
109109
isolate_->Exit();
110-
isolate_->Dispose();
111110
platform->UnregisterIsolate(isolate_);
111+
isolate_->Dispose();
112112
isolate_ = nullptr;
113113
}
114114
};

0 commit comments

Comments
 (0)