aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/windows/alloc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libui_sdl/libui/windows/alloc.cpp')
-rw-r--r--src/libui_sdl/libui/windows/alloc.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/windows/alloc.cpp b/src/libui_sdl/libui/windows/alloc.cpp
new file mode 100644
index 0000000..eeee3ad
--- /dev/null
+++ b/src/libui_sdl/libui/windows/alloc.cpp
@@ -0,0 +1,63 @@
+// 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)
+{
+ std::ostringstream oss;
+ std::string ossstr; // keep alive, just to be safe
+
+ if (heap.size() == 0)
+ return;
+ for (const auto &alloc : heap)
+ // note the void * cast; otherwise it'll be treated as a string
+ oss << (void *) (alloc.first) << " " << types[alloc.second] << "\n";
+ ossstr = oss.str();
+ userbug("Some data was leaked; either you left a uiControl lying around or there's a bug in libui itself. Leaked data:\n%s", ossstr.c_str());
+}
+
+#define rawBytes(pa) (&((*pa)[0]))
+
+void *uiAlloc(size_t size, const char *type)
+{
+ byteArray *out;
+
+ out = new byteArray(size, 0);
+ heap[rawBytes(out)] = out;
+ types[out] = type;
+ return rawBytes(out);
+}
+
+void *uiRealloc(void *_p, size_t size, const char *type)
+{
+ uint8_t *p = (uint8_t *) _p;
+ byteArray *arr;
+
+ if (p == NULL)
+ return uiAlloc(size, type);
+ arr = heap[p];
+ arr->resize(size, 0);
+ heap.erase(p);
+ heap[rawBytes(arr)] = arr;
+ return rawBytes(arr);
+}
+
+void uiFree(void *_p)
+{
+ uint8_t *p = (uint8_t *) _p;
+
+ if (p == NULL)
+ implbug("attempt to uiFree(NULL)");
+ types.erase(heap[p]);
+ delete heap[p];
+ heap.erase(p);
+}