diff --git a/src/node_platform.cc b/src/node_platform.cc index 197102068b74f4..5997c5b70bd256 100644 --- a/src/node_platform.cc +++ b/src/node_platform.cc @@ -117,6 +117,8 @@ class WorkerThreadsTaskRunner::DelayedTaskScheduler { double delay_in_seconds) { auto locked = tasks_.Lock(); + if (has_shut_down_) return; + auto entry = std::make_unique(std::move(task), priority); auto delayed = std::make_unique( this, std::move(entry), delay_in_seconds); @@ -178,6 +180,7 @@ class WorkerThreadsTaskRunner::DelayedTaskScheduler { timers.push_back(timer); for (uv_timer_t* timer : timers) scheduler_->TakeTimerTask(timer); + scheduler_->has_shut_down_ = true; uv_close(reinterpret_cast(&scheduler_->flush_tasks_), [](uv_handle_t* handle) {}); } @@ -241,6 +244,7 @@ class WorkerThreadsTaskRunner::DelayedTaskScheduler { uv_loop_t loop_; uv_async_t flush_tasks_; std::unordered_set timers_; + bool has_shut_down_ = false; }; WorkerThreadsTaskRunner::WorkerThreadsTaskRunner( diff --git a/test/parallel/test-process-exit-after-fetch-throw.js b/test/parallel/test-process-exit-after-fetch-throw.js new file mode 100644 index 00000000000000..b6868c2c9e7343 --- /dev/null +++ b/test/parallel/test-process-exit-after-fetch-throw.js @@ -0,0 +1,32 @@ +'use strict'; +// Ref: https://github.com/nodejs/node/issues/56645 +const common = require('../common'); +const assert = require('assert'); +const cp = require('child_process'); +const http = require('http'); + +if (process.argv[2] === 'child') { + http + .createServer((_, res) => { + res.writeHead(302, { Location: '/' }); + res.end(); + }) + .listen(0, '127.0.0.1', async function() { + try { + await fetch(`http://127.0.0.1:${this.address().port}/`); + } catch { + // ignore + } + process.exit(0); + }); +} else { + const child = cp.spawn(process.execPath, [__filename, 'child']); + + child.on( + 'close', + common.mustCall((exitCode, signal) => { + assert.strictEqual(exitCode, 0); + assert.strictEqual(signal, null); + }), + ); +}