Skip to content

Commit

Permalink
timers: fix eventloop block
Browse files Browse the repository at this point in the history
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: #15072
Fixes: #15068
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
Reviewed-By: Tobias Nießen <[email protected]>
Reviewed-By: James M Snell <[email protected]>
  • Loading branch information
zhangzifa authored and MylesBorins committed Nov 21, 2017
1 parent fe6829d commit ec69f0b
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/timers.js
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,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);
Expand Down
22 changes: 22 additions & 0 deletions test/sequential/test-timers-block-eventloop.js
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit ec69f0b

Please sign in to comment.