Created
April 21, 2016 00:18
-
-
Save andlabs/e6649410737e58f9363bc238c8eee31b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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