63 lines
1.4 KiB
JavaScript
Raw Normal View History

2019-05-23 16:41:26 +02:00
function rtrace(onerror) {
var blocks = new Map();
var rtrace = {
allocCount: 0,
freeCount: 0,
incrementCount: 0,
decrementCount: 0,
onalloc: function(block) {
++rtrace.allocCount;
if (blocks.has(block)) {
onerror(Error("duplicate alloc: " + block));
} else {
blocks.set(block, 0);
}
},
onfree: function(block) {
++rtrace.freeCount;
if (!blocks.has(block)) {
2019-05-24 12:16:14 +02:00
onerror(Error("orphaned free: " + block));
2019-05-23 16:41:26 +02:00
} else {
blocks.delete(block);
}
},
onincrement: function(block) {
++rtrace.incrementCount;
if (!blocks.has(block)) {
2019-05-24 12:16:14 +02:00
onerror(Error("orphaned increment: " + block));
2019-05-23 16:41:26 +02:00
} else {
let rc = blocks.get(block) + 1;
blocks.set(block, rc);
}
},
ondecrement: function(block) {
++rtrace.decrementCount;
if (!blocks.has(block)) {
2019-05-24 12:16:14 +02:00
onerror(Error("orphaned decrement: " + block));
2019-05-23 16:41:26 +02:00
} else {
let rc = blocks.get(block) - 1;
if (rc < 0) {
onerror(Error("invalid decrement: " + block));
} else {
blocks.set(block, rc);
}
}
},
get active() {
return Boolean(rtrace.allocCount + rtrace.freeCount + rtrace.incrementCount + rtrace.decrementCount);
},
get leakCount() {
return blocks.size;
}
};
return rtrace;
}
module.exports = rtrace;