mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Thu Sep 06 13:40:20 2018 +0100
Revision:
187:0387e8f68319
Parent:
180:96ed750bd169
Child:
189:f392fc9709a3
mbed-dev library. Release version 163

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