mbed-dev-f303

Committer:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4
Date:
Tue Jun 14 09:21:18 2022 +0000
Revision:
0:bdf663c61a82
lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1 /* mbed Microcontroller Library
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2 * Copyright (c) 2006-2016 ARM Limited
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4 * Licensed under the Apache License, Version 2.0 (the "License");
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 5 * you may not use this file except in compliance with the License.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 6 * You may obtain a copy of the License at
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 7 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 8 * http://www.apache.org/licenses/LICENSE-2.0
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 9 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 10 * Unless required by applicable law or agreed to in writing, software
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 11 * distributed under the License is distributed on an "AS IS" BASIS,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 13 * See the License for the specific language governing permissions and
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 14 * limitations under the License.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 15 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 16
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 17 #include "platform/mbed_mem_trace.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 18 #include "platform/mbed_stats.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 19 #include "platform/mbed_toolchain.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 20 #include "platform/SingletonPtr.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 21 #include "platform/PlatformMutex.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 22 #include <stddef.h>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 23 #include <stdio.h>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 24 #include <string.h>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 25 #include <stdlib.h>
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 26
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 27 /* There are two memory tracers in mbed OS:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 28
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 29 - the first can be used to detect the maximum heap usage at runtime. It is
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 30 activated by defining the MBED_HEAP_STATS_ENABLED macro.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 31 - the second can be used to trace each memory call by automatically invoking
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 32 a callback on each memory operation (see hal/api/mbed_mem_trace.h). It is
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 33 activated by defining the MBED_MEM_TRACING_ENABLED macro.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 34
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 35 Both tracers can be activated and deactivated in any combination. If both tracers
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 36 are active, the second one (MBED_MEM_TRACING_ENABLED) will trace the first one's
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 37 (MBED_HEAP_STATS_ENABLED) memory calls.*/
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 38
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 39 /******************************************************************************/
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 40 /* Implementation of the runtime max heap usage checker */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 41 /******************************************************************************/
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 42
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 43 /* Size must be a multiple of 8 to keep alignment */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 44 typedef struct {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 45 uint32_t size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 46 uint32_t pad;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 47 } alloc_info_t;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 48
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 49 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 50 static SingletonPtr<PlatformMutex> mem_trace_mutex;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 51 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 52 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 53 static SingletonPtr<PlatformMutex> malloc_stats_mutex;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 54 static mbed_stats_heap_t heap_stats = {0, 0, 0, 0, 0};
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 55 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 56
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 57 void mbed_stats_heap_get(mbed_stats_heap_t *stats)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 58 {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 59 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 60 extern uint32_t mbed_heap_size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 61 heap_stats.reserved_size = mbed_heap_size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 62
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 63 malloc_stats_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 64 memcpy(stats, &heap_stats, sizeof(mbed_stats_heap_t));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 65 malloc_stats_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 66 #else
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 67 memset(stats, 0, sizeof(mbed_stats_heap_t));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 68 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 69 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 70
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 71 /******************************************************************************/
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 72 /* GCC memory allocation wrappers */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 73 /******************************************************************************/
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 74
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 75 #if defined(TOOLCHAIN_GCC)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 76
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 77 #ifdef FEATURE_UVISOR
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 78 #include "uvisor-lib/uvisor-lib.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 79 #endif/* FEATURE_UVISOR */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 80
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 81 extern "C" {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 82 void * __real__malloc_r(struct _reent * r, size_t size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 83 void * __real__memalign_r(struct _reent * r, size_t alignment, size_t bytes);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 84 void * __real__realloc_r(struct _reent * r, void * ptr, size_t size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 85 void __real__free_r(struct _reent * r, void * ptr);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 86 void* __real__calloc_r(struct _reent * r, size_t nmemb, size_t size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 87 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 88
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 89 // TODO: memory tracing doesn't work with uVisor enabled.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 90 #if !defined(FEATURE_UVISOR)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 91
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 92 extern "C" void * __wrap__malloc_r(struct _reent * r, size_t size) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 93 void *ptr = NULL;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 94 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 95 malloc_stats_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 96 alloc_info_t *alloc_info = (alloc_info_t*)__real__malloc_r(r, size + sizeof(alloc_info_t));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 97 if (alloc_info != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 98 alloc_info->size = size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 99 ptr = (void*)(alloc_info + 1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 100 heap_stats.current_size += size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 101 heap_stats.total_size += size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 102 heap_stats.alloc_cnt += 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 103 if (heap_stats.current_size > heap_stats.max_size) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 104 heap_stats.max_size = heap_stats.current_size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 105 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 106 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 107 heap_stats.alloc_fail_cnt += 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 108 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 109 malloc_stats_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 110 #else // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 111 ptr = __real__malloc_r(r, size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 112 #endif // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 113 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 114 mem_trace_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 115 mbed_mem_trace_malloc(ptr, size, MBED_CALLER_ADDR());
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 116 mem_trace_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 117 #endif // #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 118 return ptr;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 119 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 120
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 121 extern "C" void * __wrap__realloc_r(struct _reent * r, void * ptr, size_t size) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 122 void *new_ptr = NULL;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 123 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 124 // Implement realloc_r with malloc and free.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 125 // The function realloc_r can't be used here directly since
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 126 // it can call into __wrap__malloc_r (returns ptr + 4) or
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 127 // resize memory directly (returns ptr + 0).
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 128
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 129 // Note - no lock needed since malloc and free are thread safe
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 130
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 131 // Get old size
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 132 uint32_t old_size = 0;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 133 if (ptr != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 134 alloc_info_t *alloc_info = ((alloc_info_t*)ptr) - 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 135 old_size = alloc_info->size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 136 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 137
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 138 // Allocate space
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 139 if (size != 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 140 new_ptr = malloc(size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 141 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 142
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 143 // If the new buffer has been allocated copy the data to it
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 144 // and free the old buffer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 145 if (new_ptr != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 146 uint32_t copy_size = (old_size < size) ? old_size : size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 147 memcpy(new_ptr, (void*)ptr, copy_size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 148 free(ptr);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 149 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 150 #else // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 151 new_ptr = __real__realloc_r(r, ptr, size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 152 #endif // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 153 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 154 mem_trace_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 155 mbed_mem_trace_realloc(new_ptr, ptr, size, MBED_CALLER_ADDR());
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 156 mem_trace_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 157 #endif // #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 158 return new_ptr;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 159 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 160
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 161 extern "C" void __wrap__free_r(struct _reent * r, void * ptr) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 162 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 163 malloc_stats_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 164 alloc_info_t *alloc_info = NULL;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 165 if (ptr != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 166 alloc_info = ((alloc_info_t*)ptr) - 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 167 heap_stats.current_size -= alloc_info->size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 168 heap_stats.alloc_cnt -= 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 169 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 170 __real__free_r(r, (void*)alloc_info);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 171 malloc_stats_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 172 #else // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 173 __real__free_r(r, ptr);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 174 #endif // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 175 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 176 mem_trace_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 177 mbed_mem_trace_free(ptr, MBED_CALLER_ADDR());
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 178 mem_trace_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 179 #endif // #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 180 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 181
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 182 extern "C" void * __wrap__calloc_r(struct _reent * r, size_t nmemb, size_t size) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 183 void *ptr = NULL;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 184 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 185 // Note - no lock needed since malloc is thread safe
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 186
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 187 ptr = malloc(nmemb * size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 188 if (ptr != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 189 memset(ptr, 0, nmemb * size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 190 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 191 #else // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 192 ptr = __real__calloc_r(r, nmemb, size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 193 #endif // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 194 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 195 mem_trace_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 196 mbed_mem_trace_calloc(ptr, nmemb, size, MBED_CALLER_ADDR());
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 197 mem_trace_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 198 #endif // #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 199 return ptr;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 200 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 201
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 202 extern "C" void * __wrap__memalign_r(struct _reent * r, size_t alignment, size_t bytes) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 203 return __real__memalign_r(r, alignment, bytes);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 204 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 205
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 206 #endif // if !defined(FEATURE_UVISOR)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 207
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 208
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 209 /******************************************************************************/
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 210 /* ARMCC / IAR memory allocation wrappers */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 211 /******************************************************************************/
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 212
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 213 #elif defined(TOOLCHAIN_ARM) || defined(__ICCARM__)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 214
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 215 #if defined(TOOLCHAIN_ARM)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 216 #define SUPER_MALLOC $Super$$malloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 217 #define SUB_MALLOC $Sub$$malloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 218 #define SUPER_REALLOC $Super$$realloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 219 #define SUB_REALLOC $Sub$$realloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 220 #define SUPER_CALLOC $Super$$calloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 221 #define SUB_CALLOC $Sub$$calloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 222 #define SUPER_FREE $Super$$free
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 223 #define SUB_FREE $Sub$$free
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 224 #elif defined(__ICCARM__)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 225 #define SUPER_MALLOC $Super$$__iar_dlmalloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 226 #define SUB_MALLOC $Sub$$__iar_dlmalloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 227 #define SUPER_REALLOC $Super$$__iar_dlrealloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 228 #define SUB_REALLOC $Sub$$__iar_dlrealloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 229 #define SUPER_CALLOC $Super$$__iar_dlcalloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 230 #define SUB_CALLOC $Sub$$__iar_dlcalloc
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 231 #define SUPER_FREE $Super$$__iar_dlfree
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 232 #define SUB_FREE $Sub$$__iar_dlfree
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 233 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 234
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 235 /* Enable hooking of memory function only if tracing is also enabled */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 236 #if defined(MBED_MEM_TRACING_ENABLED) || defined(MBED_HEAP_STATS_ENABLED)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 237
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 238 extern "C" {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 239 void *SUPER_MALLOC(size_t size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 240 void *SUPER_REALLOC(void *ptr, size_t size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 241 void *SUPER_CALLOC(size_t nmemb, size_t size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 242 void SUPER_FREE(void *ptr);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 243 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 244
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 245 extern "C" void* SUB_MALLOC(size_t size) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 246 void *ptr = NULL;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 247 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 248 malloc_stats_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 249 alloc_info_t *alloc_info = (alloc_info_t*)SUPER_MALLOC(size + sizeof(alloc_info_t));
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 250 if (alloc_info != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 251 alloc_info->size = size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 252 ptr = (void*)(alloc_info + 1);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 253 heap_stats.current_size += size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 254 heap_stats.total_size += size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 255 heap_stats.alloc_cnt += 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 256 if (heap_stats.current_size > heap_stats.max_size) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 257 heap_stats.max_size = heap_stats.current_size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 258 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 259 } else {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 260 heap_stats.alloc_fail_cnt += 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 261 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 262 malloc_stats_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 263 #else // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 264 ptr = SUPER_MALLOC(size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 265 #endif // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 266 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 267 mem_trace_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 268 mbed_mem_trace_malloc(ptr, size, MBED_CALLER_ADDR());
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 269 mem_trace_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 270 #endif // #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 271 return ptr;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 272 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 273
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 274 extern "C" void* SUB_REALLOC(void *ptr, size_t size) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 275 void *new_ptr = NULL;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 276 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 277 // Note - no lock needed since malloc and free are thread safe
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 278
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 279 // Get old size
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 280 uint32_t old_size = 0;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 281 if (ptr != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 282 alloc_info_t *alloc_info = ((alloc_info_t*)ptr) - 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 283 old_size = alloc_info->size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 284 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 285
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 286 // Allocate space
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 287 if (size != 0) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 288 new_ptr = malloc(size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 289 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 290
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 291 // If the new buffer has been allocated copy the data to it
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 292 // and free the old buffer
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 293 if (new_ptr != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 294 uint32_t copy_size = (old_size < size) ? old_size : size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 295 memcpy(new_ptr, (void*)ptr, copy_size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 296 free(ptr);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 297 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 298 #else // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 299 new_ptr = SUPER_REALLOC(ptr, size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 300 #endif // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 301 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 302 mem_trace_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 303 mbed_mem_trace_realloc(new_ptr, ptr, size, MBED_CALLER_ADDR());
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 304 mem_trace_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 305 #endif // #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 306 return new_ptr;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 307 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 308
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 309 extern "C" void *SUB_CALLOC(size_t nmemb, size_t size) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 310 void *ptr = NULL;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 311 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 312 // Note - no lock needed since malloc is thread safe
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 313 ptr = malloc(nmemb * size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 314 if (ptr != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 315 memset(ptr, 0, nmemb * size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 316 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 317 #else // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 318 ptr = SUPER_CALLOC(nmemb, size);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 319 #endif // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 320 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 321 mem_trace_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 322 mbed_mem_trace_calloc(ptr, nmemb, size, MBED_CALLER_ADDR());
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 323 mem_trace_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 324 #endif // #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 325 return ptr;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 326 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 327
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 328 extern "C" void SUB_FREE(void *ptr) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 329 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 330 malloc_stats_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 331 alloc_info_t *alloc_info = NULL;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 332 if (ptr != NULL) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 333 alloc_info = ((alloc_info_t*)ptr) - 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 334 heap_stats.current_size -= alloc_info->size;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 335 heap_stats.alloc_cnt -= 1;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 336 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 337 SUPER_FREE((void*)alloc_info);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 338 malloc_stats_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 339 #else // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 340 SUPER_FREE(ptr);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 341 #endif // #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 342 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 343 mem_trace_mutex->lock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 344 mbed_mem_trace_free(ptr, MBED_CALLER_ADDR());
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 345 mem_trace_mutex->unlock();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 346 #endif // #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 347 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 348
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 349 #endif // #if defined(MBED_MEM_TRACING_ENABLED) || defined(MBED_HEAP_STATS_ENABLED)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 350
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 351 /******************************************************************************/
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 352 /* Allocation wrappers for other toolchains are not supported yet */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 353 /******************************************************************************/
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 354
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 355 #else
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 356
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 357 #ifdef MBED_MEM_TRACING_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 358 #error Memory tracing is not supported with the current toolchain.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 359 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 360
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 361 #ifdef MBED_HEAP_STATS_ENABLED
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 362 #error Heap statistics are not supported with the current toolchain.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 363 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 364
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 365 #endif // #if defined(TOOLCHAIN_GCC)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 366