From b2834ce65b6a46ab58b65daab6a4fd15b15e52c9 Mon Sep 17 00:00:00 2001 From: Benjamin Coe Date: Wed, 23 Jan 2019 09:44:43 -0800 Subject: [PATCH] process: fix call process.reallyExit, vs., binding Some user-land modules, e.g., nyc, mocha, currently rely on patching process.reallyExit. PR-URL: https://github.com/nodejs/node/pull/25655 Fixes: https://github.com/nodejs/node/issues/25650 Reviewed-By: Gus Caplan Reviewed-By: Anna Henningsen Reviewed-By: Joyee Cheung Reviewed-By: Ruben Bridgewater Reviewed-By: Colin Ihrig --- lib/internal/process/per_thread.js | 5 ++++- test/parallel/test-process-really-exit.js | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-process-really-exit.js diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js index 6d64c636b24435..28b9afe1cf9404 100644 --- a/lib/internal/process/per_thread.js +++ b/lib/internal/process/per_thread.js @@ -149,7 +149,10 @@ function wrapProcessMethods(binding) { process._exiting = true; process.emit('exit', process.exitCode || 0); } - binding.reallyExit(process.exitCode || 0); + // FIXME(joyeecheung): This is an undocumented API that gets monkey-patched + // in the user land. Either document it, or deprecate it in favor of a + // better public alternative. + process.reallyExit(process.exitCode || 0); } function kill(pid, sig) { diff --git a/test/parallel/test-process-really-exit.js b/test/parallel/test-process-really-exit.js new file mode 100644 index 00000000000000..c806d6c4aa4808 --- /dev/null +++ b/test/parallel/test-process-really-exit.js @@ -0,0 +1,17 @@ +'use strict'; +require('../common'); +const assert = require('assert'); + +// ensure that the reallyExit hook is executed. +// see: https://github.com/nodejs/node/issues/25650 +if (process.argv[2] === 'subprocess') { + process.reallyExit = function() { + console.info('really exited'); + }; + process.exit(); +} else { + const { spawnSync } = require('child_process'); + const out = spawnSync(process.execPath, [__filename, 'subprocess']); + const observed = out.output[1].toString('utf8').trim(); + assert.strictEqual(observed, 'really exited'); +}