| Index: emcore/trunk/malloc.c |
| — | — | @@ -26,7 +26,7 @@ |
| 27 | 27 | #include "libc/tlsf/tlsf.h"
|
| 28 | 28 |
|
| 29 | 29 |
|
| 30 | | -extern char _poolstart; // These aren't ints at all, but gcc complains about void types being
|
| | 30 | +extern char _poolstart; // These aren't chars at all, but gcc complains about void types being
|
| 31 | 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;
|
| — | — | @@ -37,8 +37,12 @@ |
| 38 | 38 | {
|
| 39 | 39 | mutex_lock(&malloc_mutex, TIMEOUT_BLOCK);
|
| 40 | 40 | void* ptr = tlsf_malloc(global_mallocpool, size + 4);
|
| 41 | | - size = tlsf_block_size(ptr);
|
| 42 | | - *((struct scheduler_thread**)(ptr + size - 4)) = current_thread;
|
| | 41 | + if (ptr)
|
| | 42 | + {
|
| | 43 | + size = tlsf_block_size(ptr);
|
| | 44 | + *((struct scheduler_thread**)(ptr + size - 4)) = current_thread;
|
| | 45 | + }
|
| | 46 | + DEBUGF("malloc(%08X) => %08X (thread: %08X)", size, ptr, current_thread);
|
| 43 | 47 | mutex_unlock(&malloc_mutex);
|
| 44 | 48 | return ptr;
|
| 45 | 49 | }
|
| — | — | @@ -47,8 +51,12 @@ |
| 48 | 52 | {
|
| 49 | 53 | mutex_lock(&malloc_mutex, TIMEOUT_BLOCK);
|
| 50 | 54 | void* ptr = tlsf_memalign(global_mallocpool, align, size + 4);
|
| 51 | | - size = tlsf_block_size(ptr);
|
| 52 | | - *((struct scheduler_thread**)(ptr + size - 4)) = current_thread;
|
| | 55 | + if (ptr)
|
| | 56 | + {
|
| | 57 | + size = tlsf_block_size(ptr);
|
| | 58 | + *((struct scheduler_thread**)(ptr + size - 4)) = current_thread;
|
| | 59 | + }
|
| | 60 | + DEBUGF("memalign(%X, %08X) => %08X (thread: %08X)", align, size, ptr, current_thread);
|
| 53 | 61 | mutex_unlock(&malloc_mutex);
|
| 54 | 62 | return ptr;
|
| 55 | 63 | }
|
| — | — | @@ -58,14 +66,16 @@ |
| 59 | 67 | mutex_lock(&malloc_mutex, TIMEOUT_BLOCK);
|
| 60 | 68 | size_t oldsize = tlsf_block_size(ptr);
|
| 61 | 69 | struct scheduler_thread* owner = *((struct scheduler_thread**)(ptr + oldsize - 4));
|
| 62 | | - ptr = tlsf_realign(global_mallocpool, ptr, align, size + 4);
|
| 63 | | - if (ptr)
|
| | 70 | + void* ptr_new = tlsf_realign(global_mallocpool, ptr, align, size + 4);
|
| | 71 | + if (ptr_new)
|
| 64 | 72 | {
|
| 65 | | - size = tlsf_block_size(ptr);
|
| 66 | | - *((struct scheduler_thread**)(ptr + size - 4)) = owner;
|
| | 73 | + size = tlsf_block_size(ptr_new);
|
| | 74 | + *((struct scheduler_thread**)(ptr_new + size - 4)) = owner;
|
| 67 | 75 | }
|
| | 76 | + DEBUGF("realign(%08X, %X, %08X) => %08X (old size: %08X, owner: %08X, thread: %08X)",
|
| | 77 | + ptr, align, size, ptr_new, owner, current_thread);
|
| 68 | 78 | mutex_unlock(&malloc_mutex);
|
| 69 | | - return ptr;
|
| | 79 | + return ptr_new;
|
| 70 | 80 | }
|
| 71 | 81 |
|
| 72 | 82 | void* realloc(void* ptr, size_t size)
|
| — | — | @@ -77,6 +87,8 @@ |
| 78 | 88 | {
|
| 79 | 89 | mutex_lock(&malloc_mutex, TIMEOUT_BLOCK);
|
| 80 | 90 | size_t size = tlsf_block_size(ptr);
|
| | 91 | + DEBUGF("reownalloc(%08X, %08X) (size: %08X, old owner: %08X, thread: %08X)",
|
| | 92 | + ptr, size, owner, *((struct scheduler_thread**)(ptr + size - 4)), current_thread);
|
| 81 | 93 | *((struct scheduler_thread**)(ptr + size - 4)) = owner;
|
| 82 | 94 | mutex_unlock(&malloc_mutex);
|
| 83 | 95 | }
|
| — | — | @@ -84,6 +96,9 @@ |
| 85 | 97 | void free(void* ptr)
|
| 86 | 98 | {
|
| 87 | 99 | mutex_lock(&malloc_mutex, TIMEOUT_BLOCK);
|
| | 100 | + size_t size = tlsf_block_size(ptr);
|
| | 101 | + DEBUGF("free(%08X) (size: %08X, owner: %08X, thread: %08X)", ptr, size,
|
| | 102 | + *((struct scheduler_thread**)(ptr + size - 4)), current_thread);
|
| 88 | 103 | tlsf_free(global_mallocpool, ptr);
|
| 89 | 104 | mutex_unlock(&malloc_mutex);
|
| 90 | 105 | }
|
| — | — | @@ -97,6 +112,7 @@ |
| 98 | 113 | void free_all_of_thread(struct scheduler_thread* owner)
|
| 99 | 114 | {
|
| 100 | 115 | mutex_lock(&malloc_mutex, TIMEOUT_BLOCK);
|
| | 116 | + DEBUGF("free_all_of_thread(%08X) (thread: %08X)", owner, current_thread);
|
| 101 | 117 | tlsf_walk_heap(global_mallocpool, free_if_thread, owner);
|
| 102 | 118 | mutex_unlock(&malloc_mutex);
|
| 103 | 119 | }
|