Skip to content
This repository has been archived by the owner on Aug 31, 2018. It is now read-only.

Commit

Permalink
timers: warn on overflowed timeout duration
Browse files Browse the repository at this point in the history
Previously there wasn't any clear indicator when you hit the overflow
other than possibly unexpected behavior, and I think emitting a warning
may be appropriate.
  • Loading branch information
Fishrock123 committed Sep 19, 2017
1 parent edc403c commit b17d7b6
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 2 deletions.
19 changes: 17 additions & 2 deletions lib/timers.js
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,9 @@ exports.enroll = function(item, msecs) {

// Ensure that msecs fits into signed int32
if (msecs > TIMEOUT_MAX) {
process.emitWarning(`${msecs} does not fit into a 32-bit signed integer.` +
`\nTimer duration was truncated to ${TIMEOUT_MAX}.`,
'TimeoutOverflowWarning');
msecs = TIMEOUT_MAX;
}

Expand Down Expand Up @@ -449,8 +452,14 @@ exports.setTimeout = setTimeout;

function createSingleTimeout(callback, after, args) {
after *= 1; // coalesce to number or NaN
if (!(after >= 1 && after <= TIMEOUT_MAX))
if (!(after >= 1 && after <= TIMEOUT_MAX)) {
if (after > TIMEOUT_MAX) {
process.emitWarning(`${after} does not fit into a 32-bit signed integer.` +
'\nTimeout duration was set to 1.',
'TimeoutOverflowWarning');
}
after = 1; // schedule on next tick, follows browser behavior
}

var timer = new Timeout(after, callback, args);
if (process.domain)
Expand Down Expand Up @@ -538,8 +547,14 @@ exports.setInterval = function(callback, repeat, arg1, arg2, arg3) {

function createRepeatTimeout(callback, repeat, args) {
repeat *= 1; // coalesce to number or NaN
if (!(repeat >= 1 && repeat <= TIMEOUT_MAX))
if (!(repeat >= 1 && repeat <= TIMEOUT_MAX)) {
if (repeat > TIMEOUT_MAX) {
process.emitWarning(`${repeat} does not fit into a 32-bit signed integer.` +
'\nInterval duration was set to 1.',
'TimeoutOverflowWarning');
}
repeat = 1; // schedule on next tick, follows browser behavior
}

var timer = new Timeout(repeat, callback, args);
timer._repeat = repeat;
Expand Down
39 changes: 39 additions & 0 deletions test/parallel/test-timers-max-duration-warning.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const timers = require('timers');

const OVERFLOW = Math.pow(2, 31); // TIMEOUT_MAX is 2^31-1

function TimerNotCanceled() {
common.fail('Timer should be canceled');
}

process.on('warning', common.mustCall((warning) => {
const lines = warning.message.split('\n');

assert.strictEqual(warning.name, 'TimeoutOverflowWarning');
assert.strictEqual(lines[0], `${OVERFLOW} does not fit into a 32-bit signed` +
' integer.');
assert.strictEqual(lines.length, 2);
}, 3));


{
const timeout = setTimeout(TimerNotCanceled, OVERFLOW);
clearTimeout(timeout);
}

{
const interval = setInterval(TimerNotCanceled, OVERFLOW);
clearInterval(interval);
}

{
const timer = {
_onTimeout: TimerNotCanceled
};
timers.enroll(timer, OVERFLOW);
timers.active(timer);
timers.unenroll(timer);
}

0 comments on commit b17d7b6

Please sign in to comment.