diff --git a/lib/timers.js b/lib/timers.js index 668d5536c8186c..442789439bc7c2 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -301,6 +301,14 @@ const Timeout = function(after) { this._repeat = null; }; + +function unrefdHandle() { + this.owner._onTimeout(); + if (!this.owner._repeat) + this.owner.close(); +} + + Timeout.prototype.unref = function() { if (this._handle) { this._handle.unref(); @@ -315,7 +323,8 @@ Timeout.prototype.unref = function() { if (this._called && !this._repeat) return; this._handle = new Timer(); - this._handle[kOnTimeout] = this._onTimeout; + this._handle.owner = this; + this._handle[kOnTimeout] = unrefdHandle; this._handle.start(delay, 0); this._handle.domain = this.domain; this._handle.unref(); diff --git a/test/parallel/test-timers-unrefd-interval-still-fires.js b/test/parallel/test-timers-unrefd-interval-still-fires.js new file mode 100644 index 00000000000000..3ea94454cfdb49 --- /dev/null +++ b/test/parallel/test-timers-unrefd-interval-still-fires.js @@ -0,0 +1,18 @@ +/* + * This test is a regression test for joyent/node#8900. + */ +var assert = require('assert'); + +var N = 5; +var nbIntervalFired = 0; +var timer = setInterval(function() { + ++nbIntervalFired; + if (nbIntervalFired === N) + clearInterval(timer); +}, 1); + +timer.unref(); + +setTimeout(function onTimeout() { + assert.strictEqual(nbIntervalFired, N); +}, 100);