Incorporated the review comments

pull/13486/head
Rajkumar Kanagaraj 2020-08-24 23:54:19 +01:00
parent d30ba6ba62
commit f3c9132637
1 changed files with 19 additions and 48 deletions

View File

@ -52,53 +52,24 @@ typedef struct {
static SingletonPtr<PlatformMutex> malloc_stats_mutex;
static mbed_stats_heap_t heap_stats = {0, 0, 0, 0, 0, 0, 0};
#if defined(TOOLCHAIN_GCC)
typedef struct malloc_internal_overhead {
/* ------------------
* malloc_internal_overhead_t->| size (4 bytes) |
* ------------------
* | Padding for |
* | alignment |
* | holding neg |
* | offset to size |
* ------------------
* mem_ptr->| point to next |
* | free when freed|
* | or data load |
* | when allocated |
* ------------------
*/
/* size of the allocated payload area, including size before
OVERHEAD_OFFSET */
int size;
/* since here, the memory is either the next free block, or data load */
struct malloc_internal_overhead *next;
} malloc_internal_overhead_t;
#define OVERHEAD_OFFSET ((size_t)(&(((struct malloc_internal_overhead *)0)->next)))
static int get_malloc_internal_overhead(void *ptr)
{
malloc_internal_overhead_t *c = (malloc_internal_overhead_t *)((char *)ptr - OVERHEAD_OFFSET);
/* Skip the padding area */
if (c->size < 0) {
c = (malloc_internal_overhead_t *)((char *)c + c->size);
}
return (c->size & ~0x1);
}
#else
typedef struct {
size_t size;
typedef struct mbed_heap_overhead {
int size; // Size of the allocated memory block, including internal overhead size
struct mbed_heap_overhead *next; // The memory is either the next free block, or allocated memory block
} mbed_heap_overhead_t;
#define MALLOC_HEADER_SIZE (sizeof(mbed_heap_overhead_t))
#define MALLOC_HEADER_PTR(p) (mbed_heap_overhead_t *)((char *)(p) - MALLOC_HEADER_SIZE)
#define MALLOC_HEAP_TOTAL_SIZE(p) (((p)->size) & (~0x1))
#endif
static int get_malloc_block_total_size(void *ptr)
{
mbed_heap_overhead_t *c = (mbed_heap_overhead_t *)((char *)ptr - offsetof(mbed_heap_overhead, next));
// Skip the padding area
if (c->size < 0) {
c = (mbed_heap_overhead_t *)((char *)c + c->size);
}
// Mask LSB as it is used for usage flags
return (c->size & ~0x1);
}
#endif
void mbed_stats_heap_get(mbed_stats_heap_t *stats)
{
#if MBED_HEAP_STATS_ENABLED
@ -154,7 +125,7 @@ extern "C" void *malloc_wrapper(struct _reent *r, size_t size, void *caller)
if (heap_stats.current_size > heap_stats.max_size) {
heap_stats.max_size = heap_stats.current_size;
}
heap_stats.overhead_size += get_malloc_internal_overhead((void *)alloc_info) - size;
heap_stats.overhead_size += get_malloc_block_total_size((void *)alloc_info) - size;
} else {
heap_stats.alloc_fail_cnt += 1;
}
@ -229,7 +200,7 @@ extern "C" void free_wrapper(struct _reent *r, void *ptr, void *caller)
alloc_info = ((alloc_info_t *)ptr) - 1;
if (MBED_HEAP_STATS_SIGNATURE == alloc_info->signature) {
size_t user_size = alloc_info->size;
size_t alloc_size = get_malloc_internal_overhead((void *)alloc_info);
size_t alloc_size = get_malloc_block_total_size((void *)alloc_info);
alloc_info->signature = 0x0;
heap_stats.current_size -= user_size;
heap_stats.alloc_cnt -= 1;
@ -341,7 +312,7 @@ extern "C" void *malloc_wrapper(size_t size, void *caller)
if (heap_stats.current_size > heap_stats.max_size) {
heap_stats.max_size = heap_stats.current_size;
}
heap_stats.overhead_size += MALLOC_HEAP_TOTAL_SIZE(MALLOC_HEADER_PTR(alloc_info)) - size;
heap_stats.overhead_size += get_malloc_block_total_size((void *)alloc_info) - size;
} else {
heap_stats.alloc_fail_cnt += 1;
}
@ -454,7 +425,7 @@ extern "C" void free_wrapper(void *ptr, void *caller)
alloc_info = ((alloc_info_t *)ptr) - 1;
if (MBED_HEAP_STATS_SIGNATURE == alloc_info->signature) {
size_t user_size = alloc_info->size;
size_t alloc_size = MALLOC_HEAP_TOTAL_SIZE(MALLOC_HEADER_PTR(alloc_info));
size_t alloc_size = get_malloc_block_total_size((void *)alloc_info);
alloc_info->signature = 0x0;
heap_stats.current_size -= user_size;
heap_stats.alloc_cnt -= 1;