63 lines
1.1 KiB
C++
63 lines
1.1 KiB
C++
|
// 4 december 2014
|
||
|
#include "uipriv_windows.hpp"
|
||
|
|
||
|
typedef std::vector<uint8_t> *byteArray;
|
||
|
|
||
|
static std::map<uint8_t *, byteArray> heap;
|
||
|
static std::map<byteArray, const char *> types;
|
||
|
|
||
|
void initAlloc(void)
|
||
|
{
|
||
|
// do nothing
|
||
|
}
|
||
|
|
||
|
void uninitAlloc(void)
|
||
|
{
|
||
|
BOOL hasEntry;
|
||
|
|
||
|
hasEntry = FALSE;
|
||
|
for (const auto &alloc : heap) {
|
||
|
if (!hasEntry) {
|
||
|
fprintf(stderr, "[libui] leaked allocations:\n");
|
||
|
hasEntry = TRUE;
|
||
|
}
|
||
|
fprintf(stderr, "[libui] %p %s\n",
|
||
|
alloc.first,
|
||
|
types[alloc.second]);
|
||
|
}
|
||
|
if (hasEntry)
|
||
|
complain("either you left something around or there's a bug in libui");
|
||
|
}
|
||
|
|
||
|
void *uiAlloc(size_t size, const char *type)
|
||
|
{
|
||
|
byteArray out;
|
||
|
|
||
|
out = new byteArray(size, 0);
|
||
|
heap[&out[0]] = out;
|
||
|
types[out] = type;
|
||
|
return &out[0];
|
||
|
}
|
||
|
|
||
|
void *uiRealloc(void *p, size_t size, const char *type)
|
||
|
{
|
||
|
byteArray arr;
|
||
|
|
||
|
if (p == NULL)
|
||
|
return uiAlloc(size, type);
|
||
|
arr = heap[p];
|
||
|
arr->resize(size, 0);
|
||
|
heap.erase(p);
|
||
|
heap[&arr[0]] = arr;
|
||
|
return &arr[0];
|
||
|
}
|
||
|
|
||
|
void uiFree(void *p)
|
||
|
{
|
||
|
if (p == NULL)
|
||
|
complain("attempt to uiFree(NULL); there's a bug somewhere");
|
||
|
types.erase(heap[p]);
|
||
|
delete heap[p];
|
||
|
heap.erase(p);
|
||
|
}
|