| Index: emcore/trunk/libc/tlsf/tlsf.c |
| — | — | @@ -714,8 +714,9 @@ |
| 715 | 715 |
|
| 716 | 716 | static void default_walker(void* ptr, size_t size, int used, void* user)
|
| 717 | 717 | {
|
| 718 | | - (void)user;
|
| 719 | | - cprintf(CONSOLE_BOOT, "\t%p %s size: %x\n", ptr, used ? "used" : "free", size);
|
| | 718 | + if (used) cprintf((int)user, "%08X: %08X+8 bytes owned by %08X\n", ptr,
|
| | 719 | + size - 4, *((uint32_t*)(ptr + size - 4)));
|
| | 720 | + else cprintf((int)user, "%08X: %08X bytes free\n", ptr, size + 4);
|
| 720 | 721 | }
|
| 721 | 722 |
|
| 722 | 723 | void tlsf_walk_heap(tlsf_pool pool, tlsf_walker walker, void* user)
|
| Index: emcore/trunk/export/syscallwrappers.h |
| — | — | @@ -203,6 +203,7 @@ |
| 204 | 204 | #define lcd_get_format __emcore_syscall->lcd_get_format
|
| 205 | 205 | #define crc32 __emcore_syscall->crc32
|
| 206 | 206 | #define clockgate_get_state __emcore_syscall->clockgate_get_state
|
| | 207 | +#define malloc_walk __emcore_syscall->malloc_walk
|
| 207 | 208 |
|
| 208 | 209 |
|
| 209 | 210 | #endif
|
| Index: emcore/trunk/export/syscallapi.h |
| — | — | @@ -260,6 +260,7 @@ |
| 261 | 261 | typeof(lcd_get_format) *lcd_get_format;
|
| 262 | 262 | typeof(crc32) *crc32;
|
| 263 | 263 | typeof(clockgate_get_state) *clockgate_get_state;
|
| | 264 | + typeof(malloc_walk) *malloc_walk;
|
| 264 | 265 | };
|
| 265 | 266 |
|
| 266 | 267 |
|
| Index: emcore/trunk/malloc.c |
| — | — | @@ -26,8 +26,8 @@ |
| 27 | 27 | #include "libc/tlsf/tlsf.h"
|
| 28 | 28 |
|
| 29 | 29 |
|
| 30 | | -extern int _poolstart; // These aren't ints at all, but gcc complains about void types being
|
| 31 | | -extern int _poolend; // used here, and we only need the address, so just make it happy...
|
| | 30 | +extern char _poolstart; // These aren't ints at all, but gcc complains about void types being
|
| | 31 | +extern char _poolend; // used here, and we only need the address, so just make it happy...
|
| 32 | 32 |
|
| 33 | 33 | struct mutex malloc_mutex;
|
| 34 | 34 | tlsf_pool global_mallocpool;
|
| — | — | @@ -93,6 +93,13 @@ |
| 94 | 94 | mutex_unlock(&malloc_mutex);
|
| 95 | 95 | }
|
| 96 | 96 |
|
| | 97 | +void malloc_walk(void (*walker), void* user)
|
| | 98 | +{
|
| | 99 | + mutex_lock(&malloc_mutex, TIMEOUT_BLOCK);
|
| | 100 | + tlsf_walk_heap(global_mallocpool, walker, user);
|
| | 101 | + mutex_unlock(&malloc_mutex);
|
| | 102 | +}
|
| | 103 | +
|
| 97 | 104 | void malloc_init()
|
| 98 | 105 | {
|
| 99 | 106 | mutex_init(&malloc_mutex);
|
| Index: emcore/trunk/malloc.h |
| — | — | @@ -35,6 +35,7 @@ |
| 36 | 36 | void reownalloc(void* ptr, struct scheduler_thread* owner);
|
| 37 | 37 | void free(void* ptr) ICODE_ATTR;
|
| 38 | 38 | void free_all_of_thread(struct scheduler_thread* owner);
|
| | 39 | +void malloc_walk(void (*walker), void* user);
|
| 39 | 40 | void malloc_init() INITCODE_ATTR;
|
| 40 | 41 |
|
| 41 | 42 |
|
| Index: emcore/trunk/syscallapi.c |
| — | — | @@ -221,5 +221,6 @@ |
| 222 | 222 | #endif
|
| 223 | 223 | .lcd_get_format = lcd_get_format,
|
| 224 | 224 | .crc32 = crc32,
|
| 225 | | - .clockgate_get_state = clockgate_get_state
|
| | 225 | + .clockgate_get_state = clockgate_get_state,
|
| | 226 | + .malloc_walk = malloc_walk
|
| 226 | 227 | };
|