#include <nan.h> #include "allocator.h" void* Allocator::Alloc(void* opaque, size_t size) { return static_cast<Allocator*>(opaque)->Alloc(size); } void* Allocator::Alloc(size_t size) { void* realbuffer = malloc(size + sizeof(AllocatedBuffer)); AllocatedBuffer* buf = static_cast<AllocatedBuffer*>(realbuffer); if (!buf) { return NULL; } buf->size = size; allocated_unreported_memory += size + sizeof(*buf); return static_cast<void*>(buf + 1); } Allocator::AllocatedBuffer* Allocator::GetBufferInfo(void* address) { return static_cast<AllocatedBuffer*>(address) - 1; } void Allocator::Free(void* opaque, void* address) { if (!address) { return; } AllocatedBuffer* buf = GetBufferInfo(address); if (opaque) { Allocator* alloc = static_cast<Allocator*>(opaque); alloc->allocated_unreported_memory -= buf->size + sizeof(*buf); } else { int64_t count = buf->size + sizeof(*buf); Nan::AdjustExternalMemory(-count); } free(buf); } void Allocator::Free(void* address) { Free(this, address); } void Allocator::ReportMemoryToV8() { Nan::AdjustExternalMemory(allocated_unreported_memory); allocated_unreported_memory = 0; }