lib: use Timer.now() in readline module
Using Date.now() introduces problems when operating under load or otherwise with constrained resources. Use Timer.now() to mitigate. The problem was identified in `test-readline-interface` where under heavy load, `\r` and `\n` were received so far apart that they were treated as separate line endings rather than a single line ending. Switching to `Timer.now()` prevented this from happening. PR-URL: https://github.com/nodejs/node/pull/14681 Refs: https://github.com/nodejs/node/issues/14674 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com>
This commit is contained in:
parent
02371c7a8c
commit
fe54bc7b69
@ -48,6 +48,8 @@ const {
|
|||||||
kClearScreenDown
|
kClearScreenDown
|
||||||
} = CSI;
|
} = CSI;
|
||||||
|
|
||||||
|
const now = process.binding('timer_wrap').Timer.now;
|
||||||
|
|
||||||
const kHistorySize = 30;
|
const kHistorySize = 30;
|
||||||
const kMincrlfDelay = 100;
|
const kMincrlfDelay = 100;
|
||||||
// \r\n, \n, or \r followed by something other than \n
|
// \r\n, \n, or \r followed by something other than \n
|
||||||
@ -409,7 +411,7 @@ Interface.prototype._normalWrite = function(b) {
|
|||||||
}
|
}
|
||||||
var string = this._decoder.write(b);
|
var string = this._decoder.write(b);
|
||||||
if (this._sawReturnAt &&
|
if (this._sawReturnAt &&
|
||||||
Date.now() - this._sawReturnAt <= this.crlfDelay) {
|
now() - this._sawReturnAt <= this.crlfDelay) {
|
||||||
string = string.replace(/^\n/, '');
|
string = string.replace(/^\n/, '');
|
||||||
this._sawReturnAt = 0;
|
this._sawReturnAt = 0;
|
||||||
}
|
}
|
||||||
@ -422,7 +424,7 @@ Interface.prototype._normalWrite = function(b) {
|
|||||||
this._line_buffer = null;
|
this._line_buffer = null;
|
||||||
}
|
}
|
||||||
if (newPartContainsEnding) {
|
if (newPartContainsEnding) {
|
||||||
this._sawReturnAt = string.endsWith('\r') ? Date.now() : 0;
|
this._sawReturnAt = string.endsWith('\r') ? now() : 0;
|
||||||
|
|
||||||
// got one or more newlines; process into "line" events
|
// got one or more newlines; process into "line" events
|
||||||
var lines = string.split(lineEnding);
|
var lines = string.split(lineEnding);
|
||||||
@ -916,14 +918,14 @@ Interface.prototype._ttyWrite = function(s, key) {
|
|||||||
|
|
||||||
switch (key.name) {
|
switch (key.name) {
|
||||||
case 'return': // carriage return, i.e. \r
|
case 'return': // carriage return, i.e. \r
|
||||||
this._sawReturnAt = Date.now();
|
this._sawReturnAt = now();
|
||||||
this._line();
|
this._line();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'enter':
|
case 'enter':
|
||||||
// When key interval > crlfDelay
|
// When key interval > crlfDelay
|
||||||
if (this._sawReturnAt === 0 ||
|
if (this._sawReturnAt === 0 ||
|
||||||
Date.now() - this._sawReturnAt > this.crlfDelay) {
|
now() - this._sawReturnAt > this.crlfDelay) {
|
||||||
this._line();
|
this._line();
|
||||||
}
|
}
|
||||||
this._sawReturnAt = 0;
|
this._sawReturnAt = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user