Skip to content

Commit

Permalink
worker: do not emit 'exit' events during process.exit()
Browse files Browse the repository at this point in the history
Do not emit `'exit'` events caused by recursively stopping all
running Workers from inside the `process.exit()` call.

PR-URL: #32546
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information
addaleax committed Apr 2, 2020
1 parent d3a4865 commit 8b9e877
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/env.cc
Expand Up @@ -985,6 +985,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
@@ -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());
}
22 changes: 22 additions & 0 deletions test/parallel/test-worker-on-process-exit.js
@@ -0,0 +1,22 @@
'use strict';
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());
}

0 comments on commit 8b9e877

Please sign in to comment.