mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
worker: perform initial port.unref() before preload modules
The refcount of the internal communication port is relevant for stdio, but the `port.unref()` call effectively resets any `.ref()` calls happening during stdio operations happening before it. Therefore, do the `.unref()` call before loading preload modules, which may cause stdio operations. Fixes: https://github.com/nodejs/node/issues/31777 PR-URL: https://github.com/nodejs/node/pull/33455 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
This commit is contained in:
committed by
James M Snell
parent
b6b82cba27
commit
c45313b3ad
@@ -92,6 +92,7 @@ if (process.env.NODE_CHANNEL_FD) {
|
||||
|
||||
port.on('message', (message) => {
|
||||
if (message.type === LOAD_SCRIPT) {
|
||||
port.unref();
|
||||
const {
|
||||
argv,
|
||||
cwdCounter,
|
||||
@@ -145,7 +146,6 @@ port.on('message', (message) => {
|
||||
|
||||
debug(`[${threadId}] starts worker script ${filename} ` +
|
||||
`(eval = ${eval}) at cwd = ${process.cwd()}`);
|
||||
port.unref();
|
||||
port.postMessage({ type: UP_AND_RUNNING });
|
||||
if (doEval) {
|
||||
const { evalScript } = require('internal/process/execution');
|
||||
|
||||
20
test/parallel/test-worker-stdio-from-preload-module.js
Normal file
20
test/parallel/test-worker-stdio-from-preload-module.js
Normal file
@@ -0,0 +1,20 @@
|
||||
'use strict';
|
||||
const common = require('../common');
|
||||
const fixtures = require('../common/fixtures');
|
||||
const { Worker } = require('worker_threads');
|
||||
const assert = require('assert');
|
||||
|
||||
// Regression test for https://github.com/nodejs/node/issues/31777:
|
||||
// stdio operations coming from preload modules should count towards the
|
||||
// ref count of the internal communication port on the Worker side.
|
||||
|
||||
for (let i = 0; i < 10; i++) {
|
||||
const w = new Worker('console.log("B");', {
|
||||
execArgv: ['--require', fixtures.path('printA.js')],
|
||||
eval: true,
|
||||
stdout: true
|
||||
});
|
||||
w.on('exit', common.mustCall(() => {
|
||||
assert.strictEqual(w.stdout.read().toString(), 'A\nB\n');
|
||||
}));
|
||||
}
|
||||
Reference in New Issue
Block a user