Skip to content

Commit

Permalink
bootstrap: call _undestroy() inside _destroy for stdout and stderr
Browse files Browse the repository at this point in the history
This change makes `process.stdout` and `process.stderr` to be
automatically undestroyed when ended/destrouyed, therefore making
it always possible to write/console.log to stdout.

Fixes: #39447

PR-URL: #39685
Reviewed-By: Robert Nagy <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
Reviewed-By: Joyee Cheung <[email protected]>
  • Loading branch information
mcollina authored and danielleadams committed Aug 16, 2021
1 parent 07cadc4 commit 69a2a6b
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/internal/bootstrap/switches/is_main_thread.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ function createWritableStdioStream(fd) {

function dummyDestroy(err, cb) {
cb(err);
this._undestroy();

// We need to emit 'close' anyway so that the closing
// of the stream is observable. We just make sure we
Expand Down
36 changes: 36 additions & 0 deletions test/parallel/test-stdio-undestroy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const spawn = require('child_process').spawn;

if (process.argv[2] === 'child') {
process.stdout.destroy();
process.stderr.destroy();
console.log('stdout');
process.stdout.write('rocks\n');
console.error('stderr');
setTimeout(function() {
process.stderr.write('rocks too\n');
}, 10);
return;
}

const proc = spawn(process.execPath, [__filename, 'child'], { stdio: 'pipe' });

let stdout = '';
proc.stdout.setEncoding('utf8');
proc.stdout.on('data', common.mustCallAtLeast(function(chunk) {
stdout += chunk;
}, 1));

let stderr = '';
proc.stderr.setEncoding('utf8');
proc.stderr.on('data', common.mustCallAtLeast(function(chunk) {
stderr += chunk;
}, 1));

proc.on('exit', common.mustCall(function(exitCode) {
assert.strictEqual(exitCode, 0);
assert.strictEqual(stdout, 'stdout\nrocks\n');
assert.strictEqual(stderr, 'stderr\nrocks too\n');
}));

0 comments on commit 69a2a6b

Please sign in to comment.