From 0d051238be2e07e671d7d9f4f444e0cc1efadf1b Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Wed, 26 Nov 2014 12:27:57 -0800 Subject: [PATCH] timers: fix unref() memory leak The destructor isn't being called for timers that have been unref'd. Fixes: https://github.com/joyent/node/issues/8364 Signed-off-by: Trevor Norris --- icu_config.gypi | 2 ++ lib/timers.js | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 icu_config.gypi diff --git a/icu_config.gypi b/icu_config.gypi new file mode 100644 index 00000000000000..a21b0ceaf86def --- /dev/null +++ b/icu_config.gypi @@ -0,0 +1,2 @@ +# Do not edit. Generated by the configure script. +{ 'variables': { }} diff --git a/lib/timers.js b/lib/timers.js index be39ea66def171..1893f19789c248 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -290,6 +290,14 @@ var Timeout = function(after) { this._repeat = false; }; + +function unrefdHandle() { + this.owner._onTimeout(); + if (!this.owner.repeat) + this.owner.close(); +} + + Timeout.prototype.unref = function() { if (!this._handle) { @@ -303,7 +311,8 @@ Timeout.prototype.unref = function() { if (delay < 0) delay = 0; exports.unenroll(this); this._handle = new Timer(); - this._handle.ontimeout = this._onTimeout; + this._handle.owner = this; + this._handle.ontimeout = unrefdHandle; this._handle.start(delay, 0); this._handle.domain = this.domain; this._handle.unref();