From ef033d046ac8ecb93d0c2017d297118873a75079 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Wed, 25 Sep 2019 14:51:18 +0200 Subject: [PATCH] worker: fix process._fatalException return type This makes sure `process._fatalException()` returns a boolean when run inside of a worker. PR-URL: https://github.com/nodejs/node/pull/29706 Reviewed-By: Anna Henningsen Reviewed-By: David Carlier Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Minwoo Jung --- lib/internal/main/worker_thread.js | 40 ++++++++++--------- ...est-worker-non-fatal-uncaught-exception.js | 25 ++++++++++++ 2 files changed, 46 insertions(+), 19 deletions(-) create mode 100644 test/parallel/test-worker-non-fatal-uncaught-exception.js diff --git a/lib/internal/main/worker_thread.js b/lib/internal/main/worker_thread.js index 9cf6e669a9dbd9..9c4b578c188785 100644 --- a/lib/internal/main/worker_thread.js +++ b/lib/internal/main/worker_thread.js @@ -161,26 +161,28 @@ function workerOnGlobalUncaughtException(error, fromPromise) { } debug(`[${threadId}] uncaught exception handled = ${handled}`); - if (!handled) { - let serialized; - try { - const { serializeError } = require('internal/error-serdes'); - serialized = serializeError(error); - } catch {} - debug(`[${threadId}] uncaught exception serialized = ${!!serialized}`); - if (serialized) - port.postMessage({ - type: ERROR_MESSAGE, - error: serialized - }); - else - port.postMessage({ type: COULD_NOT_SERIALIZE_ERROR }); - - const { clearAsyncIdStack } = require('internal/async_hooks'); - clearAsyncIdStack(); - - process.exit(); + if (handled) { + return true; } + + let serialized; + try { + const { serializeError } = require('internal/error-serdes'); + serialized = serializeError(error); + } catch {} + debug(`[${threadId}] uncaught exception serialized = ${!!serialized}`); + if (serialized) + port.postMessage({ + type: ERROR_MESSAGE, + error: serialized + }); + else + port.postMessage({ type: COULD_NOT_SERIALIZE_ERROR }); + + const { clearAsyncIdStack } = require('internal/async_hooks'); + clearAsyncIdStack(); + + process.exit(); } // Patch the global uncaught exception handler so it gets picked up by diff --git a/test/parallel/test-worker-non-fatal-uncaught-exception.js b/test/parallel/test-worker-non-fatal-uncaught-exception.js new file mode 100644 index 00000000000000..01df55eec1b478 --- /dev/null +++ b/test/parallel/test-worker-non-fatal-uncaught-exception.js @@ -0,0 +1,25 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { Worker } = require('worker_threads'); + +// Check that `process._fatalException()` returns a boolean when run inside a +// worker. + +// Do not use isMainThread so that this test itself can be run inside a Worker. +if (!process.env.HAS_STARTED_WORKER) { + process.env.HAS_STARTED_WORKER = 1; + const w = new Worker(__filename); + w.on('exit', common.mustCall((code) => { + assert.strictEqual(code, 0); + })); + return; +} + +process.once('uncaughtException', () => { + process.nextTick(() => { + assert.strictEqual(res, true); + }); +}); + +const res = process._fatalException(new Error());