From ae6747ea7df36324c9a48e5571a1e6d0b60c8b4c Mon Sep 17 00:00:00 2001 From: "james.cryer" Date: Wed, 28 Feb 2018 18:15:16 +0000 Subject: [PATCH] De-reference callbacks and minor cleanup. Fixes #94 --- .npmignore | 3 ++- memory-leak-test.js | 32 ++++++++++++++++++++++++++++++++ resemble.js | 26 +++++++++++++++++--------- 3 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 memory-leak-test.js diff --git a/.npmignore b/.npmignore index db8bec0..7217801 100644 --- a/.npmignore +++ b/.npmignore @@ -8,4 +8,5 @@ chai-tests nodejs-tests .dockerignore dockerfile -.travis.yml \ No newline at end of file +.travis.yml +memory-leak-test.js \ No newline at end of file diff --git a/memory-leak-test.js b/memory-leak-test.js new file mode 100644 index 0000000..207a3a8 --- /dev/null +++ b/memory-leak-test.js @@ -0,0 +1,32 @@ +// node --expose-gc memory-leak-test.js + +const fs = require('fs'); +const resemble = require('./resemble'); +let max = 2000; +const timerLabel = "2000 compare"; +console.time(timerLabel); + +compare(); + +function compare(){ + const people = fs.readFileSync('./demoassets/ghost1.png'); + const people2 = fs.readFileSync('./demoassets/ghost2.png'); + + resemble(people).compareTo(people2).onComplete(function() { + if (--max >= 0) { + process.nextTick(compare); + } else { + process.nextTick(log); + } + global.gc(); + if (max % 100 === 0) { + var mem = process.memoryUsage(); + console.log(max, mem.rss, mem.heapUsed, mem.external); + } + }); +} + +function log(){ + console.timeEnd(timerLabel); + process.exit(0); +} \ No newline at end of file diff --git a/resemble.js b/resemble.js index f9de8cd..e27e790 100644 --- a/resemble.js +++ b/resemble.js @@ -15,10 +15,19 @@ URL: https://github.com/Huddle/Resemble.js }(this, function () { 'use strict'; - var document = typeof window != "undefined" ? window.document : { + var Img; + var Canvas; + + if (typeof Image !== 'undefined') { + Img = Image; + } else { + Canvas = require('canvas-prebuilt'); + Img = Canvas.Image; + } + + var document = typeof window !== "undefined" ? window.document : { createElement: function() { // This will work as long as only createElement is used on window.document - var Canvas = require('canvas-prebuilt'); return new Canvas(); } }; @@ -198,12 +207,9 @@ URL: https://github.com/Huddle/Resemble.js function loadImageData( fileData, callback ){ var fileReader; - var hiddenImage; - if (typeof Image !== 'undefined') { - hiddenImage = new Image(); - } else { - var CanvasImage = require('canvas-prebuilt').Image; - hiddenImage = new CanvasImage(); + var hiddenImage = new Img(); + + if (!hiddenImage.setAttribute) { hiddenImage.setAttribute = function setAttribute() { }; } @@ -212,13 +218,15 @@ URL: https://github.com/Huddle/Resemble.js } hiddenImage.onerror = function (err) { + hiddenImage.onload = null; hiddenImage.onerror = null; //fixes pollution between calls images.push({ error : err ? err + "" : "Image load error." }); callback(); }; hiddenImage.onload = function() { - hiddenImage.onload = null; //fixes pollution between calls + hiddenImage.onload = null; //fixes pollution between calls + hiddenImage.onerror = null; var hiddenCanvas = document.createElement('canvas'); var imageData;