EyalAr / lwip

Light Weight Image Processor for NodeJS
MIT License
2.36k stars 230 forks source link

Lwip crashes when processing a big image multiple times in sequence #112

Open peeter-tomberg opened 9 years ago

peeter-tomberg commented 9 years ago

(Requires "when" module)

var lwip = require('lwip');
var when = require('when');

var getMemory = function ()
{
    var memory = process.memoryUsage();
    return "mem_rss=" + (memory.rss / 1048576).toFixed(1) + "MB" +
        " mem_heap_total=" + (memory.heapTotal / 1048576).toFixed(1) + "MB" +
        " mem_heap_used=" + (memory.heapUsed / 1048576).toFixed(1) + "MB";
};

function Resizer(image) {
    this.image = image;
}
Resizer.prototype = {
    resize: function () {

        var ratio = 0.25;
        var deferred = when.defer();
        deferred.promise.finally(function () {
            console.log("after processing image", getMemory());
        });
        console.log('cloning');
        this.image.clone(function (err, clonedImage) {
            console.log('clone done, scaling');
            clonedImage.scale(ratio, function (err, image) {
                console.log('scaling done');
                if (err) {
                    deferred.reject(err);
                }
                else {
                    deferred.resolve(image);
                }
            });
        });
        return deferred.promise;
    }
};
lwip.open('./fixtures/3000x3000.gif', function (err, image) {

    var sequence = require('when/sequence');
    global.gc();

    console.log("before starting", getMemory());

    sequence([
        function () {
            return new Resizer(image).resize();
        },
        function () {
            return new Resizer(image).resize();
        },
        function () {
            return new Resizer(image).resize();
        },
        function () {
            return new Resizer(image).resize();
        },
        function () {
            return new Resizer(image).resize();
        }
    ]).then(function (){
        console.log('done resizing all');
    }).catch(function (err) {
        console.error('error occoured', err);
    });

});
C:\workspace\projects\node-api>node --expose-gc test
before starting mem_rss=89.0MB mem_heap_total=10.1MB mem_heap_used=3.4MB
cloning
clone done, scaling
scaling done
after processing image mem_rss=125.8MB mem_heap_total=10.1MB mem_heap_used=3.5MB
cloning
clone done, scaling
scaling done
after processing image mem_rss=162.5MB mem_heap_total=10.1MB mem_heap_used=3.6MB
cloning
clone done, scaling
scaling done
after processing image mem_rss=199.1MB mem_heap_total=10.1MB mem_heap_used=3.6MB
cloning
clone done, scaling
scaling done
after processing image mem_rss=235.8MB mem_heap_total=10.1MB mem_heap_used=3.6MB
cloning
clone done, scaling
scaling done
after processing image mem_rss=272.3MB mem_heap_total=10.1MB mem_heap_used=3.6MB
cloning

Im on a 64bit windows 7 running node 12. The image is from: http://placehold.it/3000x3000 Any thoughts?

peeter-tomberg commented 9 years ago

The exit code is 3221226356 ( 0xC0000374 ), which seems to be an error code for heap corruption?

peeter-tomberg commented 9 years ago

Any thoughts on this?

EyalAr commented 9 years ago

Interesting. Does it exhibit the same behaviour with node 10?