GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — src: unregister Isolate with platform before disposing · nodejs/node@ace3e70

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
  • src
    • node.h
    • node_main_instance.cc
    • node_worker.cc
  • test/cctest
    • node_test_fixture.h
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎src/node.h‎

Copy file name to clipboardExpand all lines: src/node.h
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ class NODE_EXTERN MultiIsolatePlatform : public v8::Platform {
280280

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

285286
// The platform should call the passed function once all state associated
Collapse file

‎src/node_main_instance.cc‎

Copy file name to clipboardExpand all lines: src/node_main_instance.cc
+1-1Lines changed: 1 addition & 1 deletion
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() {
Collapse file

‎src/node_worker.cc‎

Copy file name to clipboardExpand all lines: src/node_worker.cc
+6-1Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,13 @@ class WorkerThreadData {
192192
*static_cast<bool*>(data) = true;
193193
}, &platform_finished);
194194

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

198203
// Wait until the platform has cleaned up all relevant resources.
199204
while (!platform_finished)
Collapse file

‎test/cctest/node_test_fixture.h‎

Copy file name to clipboardExpand all lines: test/cctest/node_test_fixture.h
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ class NodeTestFixture : public ::testing::Test {
106106

107107
void TearDown() override {
108108
isolate_->Exit();
109-
isolate_->Dispose();
110109
platform->DrainTasks(isolate_);
111110
platform->UnregisterIsolate(isolate_);
111+
isolate_->Dispose();
112112
isolate_ = nullptr;
113113
}
114114
};

0 commit comments

Comments
0 (0)
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.