Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
worker: do not emit 'exit' events during process.exit()
Do not emit `'exit'` events caused by recursively stopping all
running Workers from inside the `process.exit()` call.
  • Loading branch information
addaleax committed Mar 29, 2020
commit 8feec47b872dd3fac5104102d631eb0b57d58937
1 change: 1 addition & 0 deletions src/env.cc
Original file line number Diff line number Diff line change
Expand Up @@ -986,6 +986,7 @@ void Environment::Exit(int exit_code) {
isolate(), stack_trace_limit(), StackTrace::kDetailed));
}
if (is_main_thread()) {
set_can_call_into_js(false);
stop_sub_worker_contexts();
DisposePlatform();
exit(exit_code);
Expand Down
20 changes: 20 additions & 0 deletions test/parallel/test-worker-nested-on-process-exit.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const { Worker, workerData } = require('worker_threads');

// Test that 'exit' events for nested Workers are not received when a Worker
// terminates itself through process.exit().

if (workerData === null) {
const nestedWorkerExitCounter = new Int32Array(new SharedArrayBuffer(4));
const w = new Worker(__filename, { workerData: nestedWorkerExitCounter });
w.on('exit', common.mustCall(() => {
assert.strictEqual(nestedWorkerExitCounter[0], 0);
}));
} else {
const nestedWorker = new Worker('setInterval(() => {}, 100)', { eval: true });
// The counter should never be increased here.
nestedWorker.on('exit', () => workerData[0]++);
nestedWorker.on('online', () => process.exit());
}
23 changes: 23 additions & 0 deletions test/parallel/test-worker-on-process-exit.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const { spawnSync } = require('child_process');
const { Worker } = require('worker_threads');

// Test that 'exit' events for Workers are not received when the main thread
// terminates itself through process.exit().

if (process.argv[2] !== 'child') {
const {
stdout, stderr, status
} = spawnSync(process.execPath, [__filename, 'child'], { encoding: 'utf8' });
assert.strictEqual(stderr, '');
assert.strictEqual(stdout, '');
assert.strictEqual(status, 0);
} else {
const nestedWorker = new Worker('setInterval(() => {}, 100)', { eval: true });
// This console.log() should never fire.
nestedWorker.on('exit', () => console.log('exit event received'));
nestedWorker.on('online', () => process.exit());
}