GeezerVison is showing github.com — worker: do not emit 'exit' events during process.exit() · nodejs/node@aeea7d9
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: src/env.cc +1Lines changed: 1 addition & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -968,6 +968,7 @@ void Environment::Exit(int exit_code) { | 968 | 968 | isolate(), stack_trace_limit(), StackTrace::kDetailed)); | 969 | 969 | } | 970 | 970 | if (is_main_thread()) { | | 971 | + set_can_call_into_js(false); | 971 | 972 | stop_sub_worker_contexts(); | 972 | 973 | DisposePlatform(); | 973 | 974 | exit(exit_code); | |
Collapse file Copy file name to clipboard +20Lines changed: 20 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +'use strict'; | | 2 | +const common = require('../common'); | | 3 | +const assert = require('assert'); | | 4 | +const { Worker, workerData } = require('worker_threads'); | | 5 | + | | 6 | +// Test that 'exit' events for nested Workers are not received when a Worker | | 7 | +// terminates itself through process.exit(). | | 8 | + | | 9 | +if (workerData === null) { | | 10 | + const nestedWorkerExitCounter = new Int32Array(new SharedArrayBuffer(4)); | | 11 | + const w = new Worker(__filename, { workerData: nestedWorkerExitCounter }); | | 12 | + w.on('exit', common.mustCall(() => { | | 13 | + assert.strictEqual(nestedWorkerExitCounter[0], 0); | | 14 | + })); | | 15 | +} else { | | 16 | + const nestedWorker = new Worker('setInterval(() => {}, 100)', { eval: true }); | | 17 | + // The counter should never be increased here. | | 18 | + nestedWorker.on('exit', () => workerData[0]++); | | 19 | + nestedWorker.on('online', () => process.exit()); | | 20 | +} |
Collapse file Copy file name to clipboard +22Lines changed: 22 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +'use strict'; | | 2 | +require('../common'); | | 3 | +const assert = require('assert'); | | 4 | +const { spawnSync } = require('child_process'); | | 5 | +const { Worker } = require('worker_threads'); | | 6 | + | | 7 | +// Test that 'exit' events for Workers are not received when the main thread | | 8 | +// terminates itself through process.exit(). | | 9 | + | | 10 | +if (process.argv[2] !== 'child') { | | 11 | + const { | | 12 | + stdout, stderr, status | | 13 | + } = spawnSync(process.execPath, [__filename, 'child'], { encoding: 'utf8' }); | | 14 | + assert.strictEqual(stderr, ''); | | 15 | + assert.strictEqual(stdout, ''); | | 16 | + assert.strictEqual(status, 0); | | 17 | +} else { | | 18 | + const nestedWorker = new Worker('setInterval(() => {}, 100)', { eval: true }); | | 19 | + // This console.log() should never fire. | | 20 | + nestedWorker.on('exit', () => console.log('exit event received')); | | 21 | + nestedWorker.on('online', () => process.exit()); | | 22 | +} |
|