From 1a1f679c78cae4c749595db0130a380d3028a4eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Bevacqua?= Date: Wed, 1 Jun 2016 17:25:17 -0300 Subject: [PATCH] fix memory leak when stopping/starting several times. --- lib/monitor.js | 7 ++++++- lib/network.js | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/monitor.js b/lib/monitor.js index 39c8695..be230da 100755 --- a/lib/monitor.js +++ b/lib/monitor.js @@ -86,7 +86,7 @@ internals.Monitor.prototype.start = function (callback) { var pmonitor = ProcessMonitor; var os = System; - var network = new Network.Monitor(self._server); + var network = self.network = new Network.Monitor(self._server); var asyncOps = { osload: os.loadavg, @@ -193,6 +193,11 @@ internals.Monitor.prototype.stop = function () { this.removeListener('ops', state.opsHandler); Wreck.removeListener('response', state.wreckHandler); + if (this.network) { + this.network.stop(); + this.network = null; + } + internals.iterateOverEventHash(state.handlers, function (event, handler) { self._server.removeListener(event, handler); diff --git a/lib/network.js b/lib/network.js index 1cd8b7b..241b4c2 100755 --- a/lib/network.js +++ b/lib/network.js @@ -8,6 +8,8 @@ var Items = require('items'); var internals = {}; +function noop () { +} module.exports.Monitor = internals.NetworkMonitor = function (server) { @@ -15,10 +17,18 @@ module.exports.Monitor = internals.NetworkMonitor = function (server) { this._responseTimes = {}; this._server = server; - this._server.on('request-internal', this._onRequest.bind(this)); - this._server.on('response', this._onResponse.bind(this)); -}; + var onReq = this._onRequest.bind(this); + var onRes = this._onResponse.bind(this); + + this._server.on('request-internal', onReq); + this._server.on('response', onRes); + this.stop = function () { + this._server.removeListener('request-internal', onReq); + this._server.removeListener('response', onRes); + this.stop = noop; + }; +}; internals.NetworkMonitor.prototype._onRequest = function (request, event, tags) {