timers: fix eventloop block

When there are at least 2 timers set by setInterval whose callback
execution are longer than interval, the eventloop will be blocked.

This commit fix the above bug.

PR-URL: https://github.com/nodejs/node/pull/15072
Fixes: https://github.com/nodejs/node/issues/15068
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
zhangzifa 2017-08-29 17:35:56 +08:00 committed by James M Snell
parent a0785845bf
commit e647c5d7de
2 changed files with 23 additions and 1 deletions

View File

@ -233,7 +233,7 @@ function listOnTimeout() {
if (diff < msecs) {
var timeRemaining = msecs - (TimerWrap.now() - timer._idleStart);
if (timeRemaining < 0) {
timeRemaining = 0;
timeRemaining = 1;
}
this.start(timeRemaining);
debug('%d list wait because diff is %d', msecs, diff);

View File

@ -0,0 +1,22 @@
'use strict';
const common = require('../common');
const fs = require('fs');
const t1 = setInterval(() => {
common.busyLoop(12);
}, 10);
const t2 = setInterval(() => {
common.busyLoop(15);
}, 10);
const t3 = setTimeout(common.mustNotCall('eventloop blocked!'), 100);
setTimeout(function() {
fs.stat('./nonexistent.txt', (err, stats) => {
clearInterval(t1);
clearInterval(t2);
clearTimeout(t3);
});
}, 50);