mirror of https://github.com/lukechilds/node.git
Browse Source
This commit fixes a regression related to IPC 'message' events. When messages are not emitted in the next tick, a 'message' handler that throws can break the IPC read loop. Refs: https://github.com/nodejs/node/pull/6909 Refs: https://github.com/nodejs/node/pull/13459 Refs: https://github.com/nodejs/node/pull/13648 PR-URL: https://github.com/nodejs/node/pull/13856 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>v6
2 changed files with 46 additions and 11 deletions
@ -0,0 +1,39 @@ |
|||
'use strict'; |
|||
const common = require('../common'); |
|||
const assert = require('assert'); |
|||
const cp = require('child_process'); |
|||
const NUM_MESSAGES = 10; |
|||
const values = []; |
|||
|
|||
for (let i = 0; i < NUM_MESSAGES; ++i) { |
|||
values[i] = i; |
|||
} |
|||
|
|||
if (process.argv[2] === 'child') { |
|||
const received = values.map(() => { return false; }); |
|||
|
|||
process.on('uncaughtException', common.mustCall((err) => { |
|||
received[err] = true; |
|||
const done = received.every((element) => { return element === true; }); |
|||
|
|||
if (done) |
|||
process.disconnect(); |
|||
}, NUM_MESSAGES)); |
|||
|
|||
process.on('message', (msg) => { |
|||
// If messages are handled synchronously, throwing should break the IPC
|
|||
// message processing.
|
|||
throw msg; |
|||
}); |
|||
|
|||
process.send('ready'); |
|||
} else { |
|||
const child = cp.fork(__filename, ['child']); |
|||
|
|||
child.on('message', common.mustCall((msg) => { |
|||
assert.strictEqual(msg, 'ready'); |
|||
values.forEach((value) => { |
|||
child.send(value); |
|||
}); |
|||
})); |
|||
} |
Loading…
Reference in new issue