Permalink
Please sign in to comment.
Browse files
child_process: add callback parameter to .send()
Add an optional callback parameter to `ChildProcess.prototype.send()` that is invoked when the message has been sent. Juggle the control channel's reference count so that in-flight messages keep the event loop (and therefore the process) alive until they have been sent. `ChildProcess.prototype.send()` and `process.send()` used to operate synchronously but became asynchronous in commit libuv/libuv@393c1c5 ("unix: set non-block mode in uv_{pipe,tcp,udp}_open"), which landed in io.js in commit 07bd05b ("deps: update libuv to 1.2.1"). Fixes: #760 PR-URL: #2620 Reviewed-By: trevnorris - Trevor Norris <trev.norris@gmail.com> Reviewed-By: jasnell - James M Snell <jasnell@gmail.com>
- Loading branch information...
Showing
with
111 additions
and 36 deletions.
- +14 −9 doc/api/child_process.markdown
- +3 −1 doc/api/cluster.markdown
- +3 −7 lib/child_process.js
- +72 −19 lib/internal/child_process.js
- +19 −0 test/parallel/test-child-process-send-cb.js
| @@ -0,0 +1,19 @@ | ||
| 'use strict'; | ||
| const common = require('../common'); | ||
| const assert = require('assert'); | ||
| const fork = require('child_process').fork; | ||
| if (process.argv[2] === 'child') { | ||
| process.send('ok', common.mustCall(function(err) { | ||
| assert.strictEqual(err, null); | ||
| })); | ||
| } else { | ||
| const child = fork(process.argv[1], ['child']); | ||
| child.on('message', common.mustCall(function(message) { | ||
| assert.strictEqual(message, 'ok'); | ||
| })); | ||
| child.on('exit', common.mustCall(function(exitCode, signalCode) { | ||
| assert.strictEqual(exitCode, 0); | ||
| assert.strictEqual(signalCode, null); | ||
| })); | ||
| } |
0 comments on commit
56d9584