From 6b7b5de7434a72b7b41a9c83fdc605f4c61752e4 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Wed, 20 Apr 2016 20:20:10 -0400 Subject: [PATCH] Migrated alloc.c to C++. This is working already :v --- windows/alloc.c | 89 ---------------------------------------- windows/alloc.cpp | 62 ++++++++++++++++++++++++++++ windows/uipriv_windows.h | 20 ++------- 3 files changed, 66 insertions(+), 105 deletions(-) delete mode 100644 windows/alloc.c create mode 100644 windows/alloc.cpp diff --git a/windows/alloc.c b/windows/alloc.c deleted file mode 100644 index 1360e7f9..00000000 --- a/windows/alloc.c +++ /dev/null @@ -1,89 +0,0 @@ -// 4 december 2014 -#include "uipriv_windows.h" - -// 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 - -static HANDLE heap; - -int initAlloc(void) -{ - heap = HeapCreate(0, 0, 0); - return heap != NULL; -} - -#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; - if (!hasEntry) { - fprintf(stderr, "[libui] leaked allocations:\n"); - hasEntry = TRUE; - } - fprintf(stderr, "[libui] %p %s\n", phe.lpData, *TYPE(phe.lpData)); - } - 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; - - 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); -} - -void *uiRealloc(void *p, size_t size, const char *type) -{ - void *out; - - 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); -} - -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()"); -} diff --git a/windows/alloc.cpp b/windows/alloc.cpp new file mode 100644 index 00000000..15caf3c6 --- /dev/null +++ b/windows/alloc.cpp @@ -0,0 +1,62 @@ +// 4 december 2014 +#include "uipriv_windows.hpp" + +typedef std::vector *byteArray; + +static std::map heap; +static std::map 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); +} diff --git a/windows/uipriv_windows.h b/windows/uipriv_windows.h index 46123e08..3940318e 100644 --- a/windows/uipriv_windows.h +++ b/windows/uipriv_windows.h @@ -1,19 +1,11 @@ // 6 january 2015 -#include "winapi.h" +#include "winapi.hpp" #include "../ui.h" -// TODO -#ifdef __cplusplus -#define this self -#endif #include "../ui_windows.h" #undef this // TODO #include "../common/uipriv.h" -#include "resources.h" -#include "compilerver.h" - -#ifdef __cplusplus -extern "C" { -#endif +#include "resources.hpp" +#include "compilerver.hpp" // ui internal window messages enum { @@ -91,7 +83,7 @@ extern void freeMenubar(HMENU); extern void uninitMenus(void); // alloc.c -extern int initAlloc(void); +extern void initAlloc(void); extern void uninitAlloc(void); // events.c @@ -194,7 +186,3 @@ extern WCHAR *fontDialogParamsToString(struct fontDialogParams *params); extern ATOM registerD2DScratchClass(HICON, HCURSOR); extern void unregisterD2DScratchClass(void); extern HWND newD2DScratch(HWND parent, RECT *rect, HMENU controlID, SUBCLASSPROC subclass, DWORD_PTR subclassData); - -#ifdef __cplusplus -} -#endif