diff options
author | Ruben Bridgewater <ruben@bridgewater.de> | 2019-09-25 14:51:18 +0200 |
---|---|---|
committer | Michaƫl Zasso <targos@protonmail.com> | 2019-10-01 14:40:24 +0200 |
commit | ef033d046ac8ecb93d0c2017d297118873a75079 (patch) | |
tree | 0379b49e7e53ca91c5171f8408d9e2e23c88d43a | |
parent | 038cbb08de39d17337b32e2dc8e49e1e175bc90a (diff) | |
download | node-new-ef033d046ac8ecb93d0c2017d297118873a75079.tar.gz |
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 <anna@addaleax.net>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Minwoo Jung <minwoo@nodesource.com>
-rw-r--r-- | lib/internal/main/worker_thread.js | 40 | ||||
-rw-r--r-- | test/parallel/test-worker-non-fatal-uncaught-exception.js | 25 |
2 files changed, 46 insertions, 19 deletions
diff --git a/lib/internal/main/worker_thread.js b/lib/internal/main/worker_thread.js index 9cf6e669a9..9c4b578c18 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 0000000000..01df55eec1 --- /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()); |