Skip to content

Commit aab53e6

Browse files
mcollinaRafaelGSS
authored andcommitted
worker: flush stdout and stderr on exit
Signed-off-by: Matteo Collina <[email protected]> PR-URL: #56428 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Paolo Insogna <[email protected]>
1 parent e1887d2 commit aab53e6

File tree

4 files changed

+68
-4
lines changed

4 files changed

+68
-4
lines changed

lib/internal/bootstrap/switches/is_not_main_thread.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,22 @@ process.removeListener('removeListener', stopListeningIfSignal);
3333

3434
const {
3535
createWorkerStdio,
36+
kStdioWantsMoreDataCallback,
3637
} = require('internal/worker/io');
3738

3839
let workerStdio;
3940
function lazyWorkerStdio() {
40-
return workerStdio ??= createWorkerStdio();
41+
if (workerStdio === undefined) {
42+
workerStdio = createWorkerStdio();
43+
process.on('exit', flushSync);
44+
}
45+
46+
return workerStdio;
47+
}
48+
49+
function flushSync() {
50+
workerStdio.stdout[kStdioWantsMoreDataCallback]();
51+
workerStdio.stderr[kStdioWantsMoreDataCallback]();
4152
}
4253

4354
function getStdout() { return lazyWorkerStdio().stdout; }

lib/internal/worker/io.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -292,9 +292,13 @@ class WritableWorkerStdio extends Writable {
292292
chunks: ArrayPrototypeMap(chunks,
293293
({ chunk, encoding }) => ({ chunk, encoding })),
294294
});
295-
ArrayPrototypePush(this[kWritableCallbacks], cb);
296-
if (this[kPort][kWaitingStreams]++ === 0)
297-
this[kPort].ref();
295+
if (process._exiting) {
296+
cb();
297+
} else {
298+
ArrayPrototypePush(this[kWritableCallbacks], cb);
299+
if (this[kPort][kWaitingStreams]++ === 0)
300+
this[kPort].ref();
301+
}
298302
}
299303

300304
_final(cb) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('assert');
4+
const { Worker, isMainThread } = require('worker_threads');
5+
6+
if (isMainThread) {
7+
const w = new Worker(__filename, { stdout: true });
8+
const expected = 'hello world';
9+
10+
let data = '';
11+
w.stdout.setEncoding('utf8');
12+
w.stdout.on('data', (chunk) => {
13+
data += chunk;
14+
});
15+
16+
w.on('exit', common.mustCall(() => {
17+
assert.strictEqual(data, expected);
18+
}));
19+
} else {
20+
process.stdout.write('hello');
21+
process.stdout.write(' ');
22+
process.stdout.write('world');
23+
process.exit(0);
24+
}
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('assert');
4+
const { Worker, isMainThread } = require('worker_threads');
5+
6+
if (isMainThread) {
7+
const w = new Worker(__filename, { stdout: true });
8+
const expected = 'hello world';
9+
10+
let data = '';
11+
w.stdout.setEncoding('utf8');
12+
w.stdout.on('data', (chunk) => {
13+
data += chunk;
14+
});
15+
16+
w.on('exit', common.mustCall(() => {
17+
assert.strictEqual(data, expected);
18+
}));
19+
} else {
20+
process.on('exit', () => {
21+
process.stdout.write(' ');
22+
process.stdout.write('world');
23+
});
24+
process.stdout.write('hello');
25+
}

0 commit comments

Comments
 (0)