mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
187:0387e8f68319
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 180:96ed750bd169 1 /* mbed Microcontroller Library
Anna Bridge 180:96ed750bd169 2 * Copyright (c) 2006-2016 ARM Limited
AnnaBridge 189:f392fc9709a3 3 * SPDX-License-Identifier: Apache-2.0
Anna Bridge 180:96ed750bd169 4 *
Anna Bridge 180:96ed750bd169 5 * Licensed under the Apache License, Version 2.0 (the "License");
Anna Bridge 180:96ed750bd169 6 * you may not use this file except in compliance with the License.
Anna Bridge 180:96ed750bd169 7 * You may obtain a copy of the License at
Anna Bridge 180:96ed750bd169 8 *
Anna Bridge 180:96ed750bd169 9 * http://www.apache.org/licenses/LICENSE-2.0
Anna Bridge 180:96ed750bd169 10 *
Anna Bridge 180:96ed750bd169 11 * Unless required by applicable law or agreed to in writing, software
Anna Bridge 180:96ed750bd169 12 * distributed under the License is distributed on an "AS IS" BASIS,
Anna Bridge 180:96ed750bd169 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Anna Bridge 180:96ed750bd169 14 * See the License for the specific language governing permissions and
Anna Bridge 180:96ed750bd169 15 * limitations under the License.
Anna Bridge 180:96ed750bd169 16 */
Anna Bridge 180:96ed750bd169 17
Anna Bridge 180:96ed750bd169 18 #include <stdlib.h>
Anna Bridge 180:96ed750bd169 19 #include <stdarg.h>
Anna Bridge 180:96ed750bd169 20 #include <stdio.h>
Anna Bridge 180:96ed750bd169 21 #include "platform/mbed_mem_trace.h"
Anna Bridge 180:96ed750bd169 22 #include "platform/mbed_critical.h"
Anna Bridge 180:96ed750bd169 23 #include "platform/SingletonPtr.h"
Anna Bridge 180:96ed750bd169 24 #include "platform/PlatformMutex.h"
Anna Bridge 180:96ed750bd169 25
Anna Bridge 180:96ed750bd169 26 /******************************************************************************
Anna Bridge 180:96ed750bd169 27 * Internal variables, functions and helpers
Anna Bridge 180:96ed750bd169 28 *****************************************************************************/
Anna Bridge 180:96ed750bd169 29
Anna Bridge 180:96ed750bd169 30 /* The callback function that will be called after a traced memory operations finishes. */
Anna Bridge 180:96ed750bd169 31 static mbed_mem_trace_cb_t mem_trace_cb;
AnnaBridge 189:f392fc9709a3 32 static mbed_mem_trace_cb_t mem_trace_cb_reserve;
Anna Bridge 180:96ed750bd169 33 /* 'trace_lock_count' guards "trace inside trace" situations (for example, the implementation
Anna Bridge 180:96ed750bd169 34 * of realloc() might call malloc() internally, and since malloc() is also traced, this could
Anna Bridge 180:96ed750bd169 35 * result in two calls to the callback function instead of one. */
Anna Bridge 180:96ed750bd169 36 static uint8_t trace_lock_count;
Anna Bridge 180:96ed750bd169 37 static SingletonPtr<PlatformMutex> mem_trace_mutex;
Anna Bridge 180:96ed750bd169 38
Anna Bridge 180:96ed750bd169 39 #define TRACE_FIRST_LOCK() (trace_lock_count < 2)
Anna Bridge 180:96ed750bd169 40
Anna Bridge 180:96ed750bd169 41
Anna Bridge 180:96ed750bd169 42 /******************************************************************************
Anna Bridge 180:96ed750bd169 43 * Public interface
Anna Bridge 180:96ed750bd169 44 *****************************************************************************/
Anna Bridge 180:96ed750bd169 45
AnnaBridge 187:0387e8f68319 46 void mbed_mem_trace_set_callback(mbed_mem_trace_cb_t cb)
AnnaBridge 187:0387e8f68319 47 {
Anna Bridge 180:96ed750bd169 48 mem_trace_cb = cb;
Anna Bridge 180:96ed750bd169 49 }
Anna Bridge 180:96ed750bd169 50
AnnaBridge 189:f392fc9709a3 51 void mbed_mem_trace_disable()
AnnaBridge 189:f392fc9709a3 52 {
AnnaBridge 189:f392fc9709a3 53 mbed_mem_trace_lock();
AnnaBridge 189:f392fc9709a3 54 if (mem_trace_cb) {
AnnaBridge 189:f392fc9709a3 55 mem_trace_cb_reserve = mem_trace_cb;
AnnaBridge 189:f392fc9709a3 56 mem_trace_cb = 0;
AnnaBridge 189:f392fc9709a3 57 }
AnnaBridge 189:f392fc9709a3 58 mbed_mem_trace_unlock();
AnnaBridge 189:f392fc9709a3 59 }
AnnaBridge 189:f392fc9709a3 60 void mbed_mem_trace_enable()
AnnaBridge 189:f392fc9709a3 61 {
AnnaBridge 189:f392fc9709a3 62 mbed_mem_trace_lock();
AnnaBridge 189:f392fc9709a3 63 if (!mem_trace_cb && mem_trace_cb_reserve) {
AnnaBridge 189:f392fc9709a3 64 mem_trace_cb = mem_trace_cb_reserve;
AnnaBridge 189:f392fc9709a3 65 }
AnnaBridge 189:f392fc9709a3 66 mbed_mem_trace_unlock();
AnnaBridge 189:f392fc9709a3 67 }
AnnaBridge 189:f392fc9709a3 68
Anna Bridge 180:96ed750bd169 69 void mbed_mem_trace_lock()
Anna Bridge 180:96ed750bd169 70 {
Anna Bridge 180:96ed750bd169 71 mem_trace_mutex->lock();
Anna Bridge 180:96ed750bd169 72 trace_lock_count++;
Anna Bridge 180:96ed750bd169 73 }
Anna Bridge 180:96ed750bd169 74
Anna Bridge 180:96ed750bd169 75 void mbed_mem_trace_unlock()
Anna Bridge 180:96ed750bd169 76 {
Anna Bridge 180:96ed750bd169 77 trace_lock_count--;
Anna Bridge 180:96ed750bd169 78 mem_trace_mutex->unlock();
Anna Bridge 180:96ed750bd169 79 }
Anna Bridge 180:96ed750bd169 80
AnnaBridge 187:0387e8f68319 81 void *mbed_mem_trace_malloc(void *res, size_t size, void *caller)
AnnaBridge 187:0387e8f68319 82 {
Anna Bridge 180:96ed750bd169 83 if (mem_trace_cb) {
Anna Bridge 180:96ed750bd169 84 if (TRACE_FIRST_LOCK()) {
Anna Bridge 180:96ed750bd169 85 mem_trace_cb(MBED_MEM_TRACE_MALLOC, res, caller, size);
Anna Bridge 180:96ed750bd169 86 }
Anna Bridge 180:96ed750bd169 87 }
Anna Bridge 180:96ed750bd169 88 return res;
Anna Bridge 180:96ed750bd169 89 }
Anna Bridge 180:96ed750bd169 90
AnnaBridge 187:0387e8f68319 91 void *mbed_mem_trace_realloc(void *res, void *ptr, size_t size, void *caller)
AnnaBridge 187:0387e8f68319 92 {
Anna Bridge 180:96ed750bd169 93 if (mem_trace_cb) {
Anna Bridge 180:96ed750bd169 94 if (TRACE_FIRST_LOCK()) {
Anna Bridge 180:96ed750bd169 95 mem_trace_cb(MBED_MEM_TRACE_REALLOC, res, caller, ptr, size);
Anna Bridge 180:96ed750bd169 96 }
Anna Bridge 180:96ed750bd169 97 }
Anna Bridge 180:96ed750bd169 98 return res;
Anna Bridge 180:96ed750bd169 99 }
Anna Bridge 180:96ed750bd169 100
AnnaBridge 187:0387e8f68319 101 void *mbed_mem_trace_calloc(void *res, size_t num, size_t size, void *caller)
AnnaBridge 187:0387e8f68319 102 {
Anna Bridge 180:96ed750bd169 103 if (mem_trace_cb) {
Anna Bridge 180:96ed750bd169 104 if (TRACE_FIRST_LOCK()) {
Anna Bridge 180:96ed750bd169 105 mem_trace_cb(MBED_MEM_TRACE_CALLOC, res, caller, num, size);
Anna Bridge 180:96ed750bd169 106 }
Anna Bridge 180:96ed750bd169 107 }
Anna Bridge 180:96ed750bd169 108 return res;
Anna Bridge 180:96ed750bd169 109 }
Anna Bridge 180:96ed750bd169 110
AnnaBridge 187:0387e8f68319 111 void mbed_mem_trace_free(void *ptr, void *caller)
AnnaBridge 187:0387e8f68319 112 {
Anna Bridge 180:96ed750bd169 113 if (mem_trace_cb) {
Anna Bridge 180:96ed750bd169 114 if (TRACE_FIRST_LOCK()) {
Anna Bridge 180:96ed750bd169 115 mem_trace_cb(MBED_MEM_TRACE_FREE, NULL, caller, ptr);
Anna Bridge 180:96ed750bd169 116 }
Anna Bridge 180:96ed750bd169 117 }
Anna Bridge 180:96ed750bd169 118 }
Anna Bridge 180:96ed750bd169 119
AnnaBridge 187:0387e8f68319 120 void mbed_mem_trace_default_callback(uint8_t op, void *res, void *caller, ...)
AnnaBridge 187:0387e8f68319 121 {
Anna Bridge 180:96ed750bd169 122 va_list va;
Anna Bridge 180:96ed750bd169 123 size_t temp_s1, temp_s2;
Anna Bridge 180:96ed750bd169 124 void *temp_ptr;
Anna Bridge 180:96ed750bd169 125
Anna Bridge 180:96ed750bd169 126 va_start(va, caller);
AnnaBridge 187:0387e8f68319 127 switch (op) {
Anna Bridge 180:96ed750bd169 128 case MBED_MEM_TRACE_MALLOC:
Anna Bridge 180:96ed750bd169 129 temp_s1 = va_arg(va, size_t);
Anna Bridge 180:96ed750bd169 130 printf(MBED_MEM_DEFAULT_TRACER_PREFIX "m:%p;%p-%u\n", res, caller, temp_s1);
Anna Bridge 180:96ed750bd169 131 break;
Anna Bridge 180:96ed750bd169 132
Anna Bridge 180:96ed750bd169 133 case MBED_MEM_TRACE_REALLOC:
AnnaBridge 187:0387e8f68319 134 temp_ptr = va_arg(va, void *);
Anna Bridge 180:96ed750bd169 135 temp_s1 = va_arg(va, size_t);
Anna Bridge 180:96ed750bd169 136 printf(MBED_MEM_DEFAULT_TRACER_PREFIX "r:%p;%p-%p;%u\n", res, caller, temp_ptr, temp_s1);
Anna Bridge 180:96ed750bd169 137 break;
Anna Bridge 180:96ed750bd169 138
Anna Bridge 180:96ed750bd169 139 case MBED_MEM_TRACE_CALLOC:
Anna Bridge 180:96ed750bd169 140 temp_s1 = va_arg(va, size_t);
Anna Bridge 180:96ed750bd169 141 temp_s2 = va_arg(va, size_t);
Anna Bridge 180:96ed750bd169 142 printf(MBED_MEM_DEFAULT_TRACER_PREFIX "c:%p;%p-%u;%u\n", res, caller, temp_s1, temp_s2);
Anna Bridge 180:96ed750bd169 143 break;
Anna Bridge 180:96ed750bd169 144
Anna Bridge 180:96ed750bd169 145 case MBED_MEM_TRACE_FREE:
AnnaBridge 187:0387e8f68319 146 temp_ptr = va_arg(va, void *);
Anna Bridge 180:96ed750bd169 147 printf(MBED_MEM_DEFAULT_TRACER_PREFIX "f:%p;%p-%p\n", res, caller, temp_ptr);
Anna Bridge 180:96ed750bd169 148 break;
Anna Bridge 180:96ed750bd169 149
Anna Bridge 180:96ed750bd169 150 default:
Anna Bridge 180:96ed750bd169 151 printf("?\n");
Anna Bridge 180:96ed750bd169 152 }
Anna Bridge 180:96ed750bd169 153 va_end(va);
Anna Bridge 180:96ed750bd169 154 }
Anna Bridge 180:96ed750bd169 155