From c079e437848c54909b70e14539989368201e81e7 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Fri, 8 May 2015 17:51:05 -0400 Subject: [PATCH] Somewhat implemented uninitAlloc() on OS X. --- darwin/alloc.m | 21 +++++++++++++++++++++ darwin/init.m | 2 +- darwin/uipriv_darwin.h | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/darwin/alloc.m b/darwin/alloc.m index 07f5d99c..0ff9bc57 100644 --- a/darwin/alloc.m +++ b/darwin/alloc.m @@ -2,8 +2,11 @@ #import #import "uipriv_darwin.h" +NSMutableArray *allocations; + void initAlloc(void) { + allocations = [NSMutableArray new]; } #define UINT8(p) ((uint8_t *) (p)) @@ -17,6 +20,20 @@ void initAlloc(void) void uninitAlloc(void) { + if ([allocations count] == 0) { + [allocations release]; + return; + } + fprintf(stderr, "[libui] leaked allocations:\n"); + [allocations enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) { + NSValue *v; + void *ptr; + + v = (NSValue *) obj; + ptr = [v pointerValue]; + fprintf(stderr, "[libui] %p %s\n", ptr, *TYPE(ptr)); + }]; + complain("either you left something around or there's a bug in libui"); } void *uiAlloc(size_t size, const char *type) @@ -31,6 +48,7 @@ void *uiAlloc(size_t size, const char *type) memset(DATA(out), 0, size); *SIZE(out) = size; *TYPE(out) = type; + [allocations addObject:[NSValue valueWithPointer:out]]; return DATA(out); } @@ -51,6 +69,8 @@ void *uiRealloc(void *p, size_t new, const char *type) if (new <= *s) memset(((uint8_t *) DATA(out)) + *s, 0, new - *s); *s = new; + [allocations removeObject:[NSValue valueWithPointer:p]]; + [allocations addObject:[NSValue valueWithPointer:out]]; return DATA(out); } @@ -59,4 +79,5 @@ void uiFree(void *p) if (p == NULL) complain("attempt to uiFree(NULL); there's a bug somewhere"); free(BASE(p)); + [allocations removeObject:[NSValue valueWithPointer:p]]; } diff --git a/darwin/init.m b/darwin/init.m index 61140b4a..f6a5ac42 100644 --- a/darwin/init.m +++ b/darwin/init.m @@ -67,7 +67,7 @@ void uiUninit(void) { // TODO free menus // TODO free application delegate - // TODO uninit alloc + uninitAlloc(); } void uiFreeInitError(const char *err) diff --git a/darwin/uipriv_darwin.h b/darwin/uipriv_darwin.h index bd486ca8..9e621328 100644 --- a/darwin/uipriv_darwin.h +++ b/darwin/uipriv_darwin.h @@ -49,3 +49,4 @@ extern uiWindow *windowFromNSWindow(NSWindow *); // alloc.m extern void initAlloc(void); +extern void uninitAlloc(void);