diff --git a/lib/timers.js b/lib/timers.js index 7fa683eac5..96d57ec34c 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -287,7 +287,9 @@ var Timeout = function(after) { }; Timeout.prototype.unref = function() { - if (!this._handle) { + if (this._handle) { + this._handle.unref(); + } else if (typeof(this._onTimeout) === 'function') { var now = Timer.now(); if (!this._idleStart) this._idleStart = now; var delay = this._idleStart + this._idleTimeout - now; @@ -298,8 +300,6 @@ Timeout.prototype.unref = function() { this._handle.start(delay, 0); this._handle.domain = this.domain; this._handle.unref(); - } else { - this._handle.unref(); } }; diff --git a/test/parallel/test-timers-unref-call.js b/test/parallel/test-timers-unref-call.js new file mode 100644 index 0000000000..b6f7357549 --- /dev/null +++ b/test/parallel/test-timers-unref-call.js @@ -0,0 +1,25 @@ +// Copyright (c) 2014, StrongLoop Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +var common = require('../common'); + +var Timer = process.binding('timer_wrap').Timer; +Timer.now = function() { return ++Timer.now.ticks; }; +Timer.now.ticks = 0; + +var t = setInterval(function() {}, 1); +var o = { _idleStart: 0, _idleTimeout: 1 }; +t.unref.call(o); + +setTimeout(clearInterval.bind(null, t), 2);