lib: simplify nextTick() usage

This commit removes unnecessary nextTick() closures and adds some
shared nextTick() callbacks for better re-use.

PR-URL: https://github.com/nodejs/io.js/pull/1612
Reviewed-By: Yosuke Furukawa <yosuke.furukawa@gmail.com>
Reviewed-By: Brendan Ashworth <brendan.ashworth@me.com>
This commit is contained in:
Brian White 2015-05-04 14:40:25 -04:00
parent a74c2c9458
commit 5abd4ac079
7 changed files with 42 additions and 57 deletions

View File

@ -292,22 +292,16 @@ function doWrite(stream, state, writev, len, chunk, encoding, cb) {
} }
function onwriteError(stream, state, sync, er, cb) { function onwriteError(stream, state, sync, er, cb) {
--state.pendingcb;
if (sync) if (sync)
process.nextTick(onwriteErrorNT, state, cb, er); process.nextTick(cb, er);
else { else
state.pendingcb--;
cb(er); cb(er);
}
stream._writableState.errorEmitted = true; stream._writableState.errorEmitted = true;
stream.emit('error', er); stream.emit('error', er);
} }
function onwriteErrorNT(state, cb, er) {
state.pendingcb--;
cb(er);
}
function onwriteStateUpdate(state) { function onwriteStateUpdate(state) {
state.writing = false; state.writing = false;
state.writecb = null; state.writecb = null;

View File

@ -448,16 +448,16 @@ CryptoStream.prototype.destroy = function(err) {
} }
this._opposite.destroy(); this._opposite.destroy();
process.nextTick(destroyNT, this, err); process.nextTick(destroyNT, this, err ? true : false);
}; };
function destroyNT(self, err) { function destroyNT(self, hadErr) {
// Force EOF // Force EOF
self.push(null); self.push(null);
// Emit 'close' event // Emit 'close' event
self.emit('close', err ? true : false); self.emit('close', hadErr);
} }

View File

@ -444,9 +444,7 @@ TLSSocket.prototype.renegotiate = function(options, callback) {
} }
if (!this._handle.renegotiate()) { if (!this._handle.renegotiate()) {
if (callback) { if (callback) {
process.nextTick(function() { process.nextTick(callback, new Error('Failed to renegotiate'));
callback(new Error('Failed to renegotiate'));
});
} }
return false; return false;
} }

View File

@ -320,19 +320,14 @@ Socket.prototype.send = function(buffer,
!!callback); !!callback);
if (err && callback) { if (err && callback) {
// don't emit as error, dgram_legacy.js compatibility // don't emit as error, dgram_legacy.js compatibility
process.nextTick(sendEmitErrorNT, err, address, port, callback); var ex = exceptionWithHostPort(err, 'send', address, port);
process.nextTick(callback, ex);
} }
} }
}); });
}; };
function sendEmitErrorNT(err, address, port, callback) {
var ex = exceptionWithHostPort(err, 'send', address, port);
callback(ex);
}
function afterSend(err) { function afterSend(err) {
if (err) { if (err) {
err = exceptionWithHostPort(err, 'send', this.address, this.port); err = exceptionWithHostPort(err, 'send', this.address, this.port);

View File

@ -61,17 +61,16 @@ function makeAsync(callback) {
// The API already returned, we can invoke the callback immediately. // The API already returned, we can invoke the callback immediately.
callback.apply(null, arguments); callback.apply(null, arguments);
} else { } else {
process.nextTick(callMakeAsyncCbNT, callback, arguments); var args = new Array(arguments.length + 1);
args[0] = callback;
for (var i = 1, a = 0; a < arguments.length; ++i, ++a)
args[i] = arguments[a];
process.nextTick.apply(null, args);
} }
}; };
} }
function callMakeAsyncCbNT(callback, args) {
callback.apply(null, args);
}
function onlookup(err, addresses) { function onlookup(err, addresses) {
if (err) { if (err) {
return this.callback(errnoException(err, 'getaddrinfo', this.hostname)); return this.callback(errnoException(err, 'getaddrinfo', this.hostname));

View File

@ -268,14 +268,10 @@ function writeAfterFIN(chunk, encoding, cb) {
// TODO: defer error events consistently everywhere, not just the cb // TODO: defer error events consistently everywhere, not just the cb
self.emit('error', er); self.emit('error', er);
if (typeof cb === 'function') { if (typeof cb === 'function') {
process.nextTick(writeAfterFINNT, cb, er); process.nextTick(cb, er);
} }
} }
function writeAfterFINNT(cb, er) {
cb(er);
}
exports.Socket = Socket; exports.Socket = Socket;
exports.Stream = Socket; // Legacy naming. exports.Stream = Socket; // Legacy naming.
@ -442,9 +438,7 @@ Socket.prototype._destroy = function(exception, cb) {
function fireErrorCallbacks() { function fireErrorCallbacks() {
if (cb) cb(exception); if (cb) cb(exception);
if (exception && !self._writableState.errorEmitted) { if (exception && !self._writableState.errorEmitted) {
process.nextTick(function() { process.nextTick(emitErrorNT, self, exception);
self.emit('error', exception);
});
self._writableState.errorEmitted = true; self._writableState.errorEmitted = true;
} }
} }
@ -962,7 +956,10 @@ function lookupAndConnect(self, options) {
// immediately calls net.Socket.connect() on it (that's us). // immediately calls net.Socket.connect() on it (that's us).
// There are no event listeners registered yet so defer the // There are no event listeners registered yet so defer the
// error event to the next tick. // error event to the next tick.
process.nextTick(connectErrorNT, self, err, options); err.host = options.host;
err.port = options.port;
err.message = err.message + ' ' + options.host + ':' + options.port;
process.nextTick(connectErrorNT, self, err);
} else { } else {
self._unrefTimer(); self._unrefTimer();
connect(self, connect(self,
@ -976,10 +973,7 @@ function lookupAndConnect(self, options) {
} }
function connectErrorNT(self, err, options) { function connectErrorNT(self, err) {
err.host = options.host;
err.port = options.port;
err.message = err.message + ' ' + options.host + ':' + options.port;
self.emit('error', err); self.emit('error', err);
self._destroy(); self._destroy();
} }
@ -1205,9 +1199,7 @@ Server.prototype._listen2 = function(address, port, addressType, backlog, fd) {
if (typeof rval === 'number') { if (typeof rval === 'number') {
var error = exceptionWithHostPort(rval, 'listen', address, port); var error = exceptionWithHostPort(rval, 'listen', address, port);
process.nextTick(function() { process.nextTick(emitErrorNT, self, error);
self.emit('error', error);
});
return; return;
} }
self._handle = rval; self._handle = rval;
@ -1222,9 +1214,7 @@ Server.prototype._listen2 = function(address, port, addressType, backlog, fd) {
var ex = exceptionWithHostPort(err, 'listen', address, port); var ex = exceptionWithHostPort(err, 'listen', address, port);
self._handle.close(); self._handle.close();
self._handle = null; self._handle = null;
process.nextTick(function() { process.nextTick(emitErrorNT, self, ex);
self.emit('error', ex);
});
return; return;
} }
@ -1239,6 +1229,11 @@ Server.prototype._listen2 = function(address, port, addressType, backlog, fd) {
}; };
function emitErrorNT(self, err) {
self.emit('error', err);
}
function emitListeningNT(self) { function emitListeningNT(self) {
// ensure handle hasn't closed // ensure handle hasn't closed
if (self._handle) if (self._handle)
@ -1412,9 +1407,7 @@ function onconnection(err, clientHandle) {
Server.prototype.getConnections = function(cb) { Server.prototype.getConnections = function(cb) {
function end(err, connections) { function end(err, connections) {
process.nextTick(function() { process.nextTick(cb, err, connections);
cb(err, connections);
});
} }
if (!this._usingSlaves) { if (!this._usingSlaves) {
@ -1493,11 +1486,14 @@ Server.prototype._emitCloseIfDrained = function() {
return; return;
} }
process.nextTick(function() { process.nextTick(emitCloseNT, self);
};
function emitCloseNT(self) {
debug('SERVER: emit close'); debug('SERVER: emit close');
self.emit('close'); self.emit('close');
}); }
};
Server.prototype.listenFD = util.deprecate(function(fd, type) { Server.prototype.listenFD = util.deprecate(function(fd, type) {

View File

@ -97,9 +97,7 @@ function listOnTimeout() {
// when the timeout threw its exception. // when the timeout threw its exception.
var oldDomain = process.domain; var oldDomain = process.domain;
process.domain = null; process.domain = null;
process.nextTick(function() { process.nextTick(listOnTimeoutNT, list);
list[kOnTimeout]();
});
process.domain = oldDomain; process.domain = oldDomain;
} }
} }
@ -113,6 +111,11 @@ function listOnTimeout() {
} }
function listOnTimeoutNT(list) {
list[kOnTimeout]();
}
const unenroll = exports.unenroll = function(item) { const unenroll = exports.unenroll = function(item) {
L.remove(item); L.remove(item);