Skip to content

Instantly share code, notes, and snippets.

@andlabs
Created April 21, 2016 00:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andlabs/e6649410737e58f9363bc238c8eee31b to your computer and use it in GitHub Desktop.
Save andlabs/e6649410737e58f9363bc238c8eee31b to your computer and use it in GitHub Desktop.
diff --git a/windows/alloc.c b/windows/alloc.c
index 1360e7f..15caf3c 100644
--- a/windows/alloc.c
+++ b/windows/alloc.c
@@ -1,89 +1,62 @@
// 4 december 2014
-#include "uipriv_windows.h"
+#include "uipriv_windows.hpp"
-// wrappers for allocator of choice
-// panics on memory exhausted, undefined on heap corruption or other unreliably-detected malady (see http://stackoverflow.com/questions/28761680/is-there-a-windows-api-memory-allocator-deallocator-i-can-use-that-will-just-giv)
-// new memory is set to zero
-// passing NULL to tableRealloc() acts like tableAlloc()
-// passing NULL to tableFree() is a no-op
+typedef std::vector<uint8_t> *byteArray;
-static HANDLE heap;
+static std::map<uint8_t *, byteArray> heap;
+static std::map<byteArray, const char *> types;
-int initAlloc(void)
+void initAlloc(void)
{
- heap = HeapCreate(0, 0, 0);
- return heap != NULL;
+ // do nothing
}
-#define UINT8(p) ((uint8_t *) (p))
-#define PVOID(p) ((void *) (p))
-#define EXTRA (sizeof (const char **))
-#define DATA(p) PVOID(UINT8(p) + EXTRA)
-#define BASE(p) PVOID(UINT8(p) - EXTRA)
-#define CCHAR(p) ((const char **) (p))
-#define TYPE(p) CCHAR(UINT8(p))
-
void uninitAlloc(void)
{
BOOL hasEntry;
- PROCESS_HEAP_ENTRY phe;
- DWORD le;
hasEntry = FALSE;
- ZeroMemory(&phe, sizeof (PROCESS_HEAP_ENTRY));
- while (HeapWalk(heap, &phe) != 0) {
- // skip non-allocations
- if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) == 0)
- continue;
+ for (const auto &alloc : heap) {
if (!hasEntry) {
fprintf(stderr, "[libui] leaked allocations:\n");
hasEntry = TRUE;
}
- fprintf(stderr, "[libui] %p %s\n", phe.lpData, *TYPE(phe.lpData));
+ fprintf(stderr, "[libui] %p %s\n",
+ alloc.first,
+ types[alloc.second]);
}
- le = GetLastError();
- SetLastError(le); // just in case
- if (le != ERROR_NO_MORE_ITEMS)
- logLastError("error walking heap in uninitAlloc()");
if (hasEntry)
complain("either you left something around or there's a bug in libui");
- if (HeapDestroy(heap) == 0)
- logLastError("error destroying heap in uninitAlloc()");
}
void *uiAlloc(size_t size, const char *type)
{
- void *out;
+ byteArray out;
- out = HeapAlloc(heap, HEAP_ZERO_MEMORY, EXTRA + size);
- if (out == NULL) {
- fprintf(stderr, "memory exhausted in uiAlloc()\n");
- abort();
- }
- *TYPE(out) = type;
- return DATA(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)
{
- void *out;
+ byteArray arr;
if (p == NULL)
return uiAlloc(size, type);
- p = BASE(p);
- out = HeapReAlloc(heap, HEAP_ZERO_MEMORY, p, EXTRA + size);
- if (out == NULL) {
- fprintf(stderr, "memory exhausted in uiRealloc()\n");
- abort();
- }
- return DATA(out);
+ 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");
- p = BASE(p);
- if (HeapFree(heap, 0, p) == 0)
- logLastError("error freeing memory in uiFree()");
+ types.erase(heap[p]);
+ delete heap[p];
+ heap.erase(p);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment