From e224950cf48abe0a0d439fb8d4f154fe59984de7 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 7 Dec 2014 16:22:51 -0500 Subject: [PATCH] Some allocator cleanup in the new Table. --- wintable/new/main.c | 8 ++------ wintable/new/util.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/wintable/new/main.c b/wintable/new/main.c index cd0b906..4e2663f 100644 --- a/wintable/new/main.c +++ b/wintable/new/main.c @@ -72,11 +72,7 @@ static LRESULT CALLBACK tableWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM if (uMsg == WM_NCCREATE) { CREATESTRUCTW *cs = (CREATESTRUCTW *) lParam; - // TODO find something that DOES set a last error code to use instead, or figure out how to abuse SEH temporarily so we can use HeapAlloc()... - t = (struct table *) malloc(sizeof (struct table)); - if (t == NULL) - panic("error allocating internal Table data structure"); - ZeroMemory(t, sizeof (struct table)); + t = (struct table *) tableAlloc(sizeof (struct table), "error allocating internal Table data structure"); t->hwnd = hwnd; SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR) t); } @@ -87,7 +83,7 @@ static LRESULT CALLBACK tableWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM if (uMsg == WM_DESTROY) { // TODO free appropriate (after figuring this part out) components of t // TODO send DESTROY events to accessibility listeners (when appropriate) - free(t); + tableFree(t, "error allocating internal Table data structure"); return DefWindowProcW(hwnd, uMsg, wParam, lParam); } if (runHandlers(handlers, t, uMsg, wParam, lParam, &lResult)) diff --git a/wintable/new/util.h b/wintable/new/util.h index 2bcfd94..dc51605 100644 --- a/wintable/new/util.h +++ b/wintable/new/util.h @@ -12,3 +12,37 @@ static BOOL runHandlers(const handlerfunc list[], struct table *t, UINT uMsg, WP return TRUE; return FALSE; } + +// memory allocation stuff +// each of these functions do an implicit ZeroMemory() +// we're using LocalAlloc() because: +// - whether the malloc() family supports the last-error code is undefined +// - the HeapAlloc() family DOES NOT support the last-error code; you're supposed to use Windows exceptions, and I can't find a clean way to do this with MinGW-w64 that doesn't rely on inline assembly or external libraries (unless they added __try/__except blocks) +// - there's no VirtualReAlloc() to complement VirtualAlloc() and I'm not sure if we can even get the original allocated size back out reliably to write it ourselves (http://blogs.msdn.com/b/oldnewthing/archive/2012/03/16/10283988.aspx) +// needless to say, TODO + +static void *tableAlloc(size_t size, const char *panicMessage) +{ + HLOCAL out; + + out = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, size); + if (out == NULL) + panic(panicMessage); + return (void *) out; +} + +static void *tableRealloc(void *p, size_t size, const char *panicMessage) +{ + HLOCAL out; + + out = LocalReAlloc((HLOCAL) p, size, LMEM_ZEROINIT); + if (out == NULL) + panic(panicMessage); + return (void *) out; +} + +static void tableFree(void *p, const char *panicMessage) +{ + if (LocalFree((HLOCAL) p) != NULL) + panic(panicMessage); +}