node/test/async-hooks/test-udpsendwrap.js
Anna Henningsen afdc3d0d18 dgram: use uv_udp_try_send()
This improves dgram performance by avoiding unnecessary async
operations.

One issue with this commit is that it seems hard to actually create
conditions under which the fallback path to the async case is
actually taken, for all supported OS, so an internal CLI option
is used for testing that path.

Another caveat is that the lack of an async operation means
that there are slight timing differences (essentially `nextTick()`
rather than `setImmediate()` for the send callback).

PR-URL: https://github.com/nodejs/node/pull/29832
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2019-10-05 17:48:10 -07:00

57 lines
1.6 KiB
JavaScript

// Flags: --test-udp-no-try-send
'use strict';
const common = require('../common');
const assert = require('assert');
const initHooks = require('./init-hooks');
const { checkInvocations } = require('./hook-checks');
const dgram = require('dgram');
const hooks = initHooks();
hooks.enable();
let send;
const sock = dgram
.createSocket('udp4')
.on('listening', common.mustCall(onlistening))
.bind();
function onlistening() {
sock.send(
Buffer.alloc(2), 0, 2, sock.address().port,
undefined, common.mustCall(onsent));
// Init not called synchronously because dns lookup always wraps
// callback in a next tick even if no lookup is needed
// TODO (trevnorris) submit patch to fix creation of tick objects and instead
// create the send wrap synchronously.
assert.strictEqual(hooks.activitiesOfTypes('UDPSENDWRAP').length, 0);
}
function onsent() {
const as = hooks.activitiesOfTypes('UDPSENDWRAP');
send = as[0];
assert.strictEqual(as.length, 1);
assert.strictEqual(send.type, 'UDPSENDWRAP');
assert.strictEqual(typeof send.uid, 'number');
assert.strictEqual(typeof send.triggerAsyncId, 'number');
checkInvocations(send, { init: 1, before: 1 }, 'when message sent');
sock.close(common.mustCall(onsockClosed));
}
function onsockClosed() {
checkInvocations(send, { init: 1, before: 1, after: 1 }, 'when sock closed');
}
process.on('exit', onexit);
function onexit() {
hooks.disable();
hooks.sanityCheck('UDPSENDWRAP');
checkInvocations(send, { init: 1, before: 1, after: 1, destroy: 1 },
'when process exits');
}