mbed library sources. Supersedes mbed-src.
Fork of mbed-dev by
Embed:
(wiki syntax)
Show/hide line numbers
mbed_mem_trace.c
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2016 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #include <stdlib.h> 00018 #include <stdarg.h> 00019 #include <stdio.h> 00020 #include "platform/mbed_mem_trace.h" 00021 #include "platform/critical.h" 00022 00023 /****************************************************************************** 00024 * Internal variables, functions and helpers 00025 *****************************************************************************/ 00026 00027 /* The callback function that will be called after a traced memory operations finishes. */ 00028 static mbed_mem_trace_cb_t mem_trace_cb; 00029 /* 'trave_level' guards "trace inside trace" situations (for example, the implementation 00030 * of realloc() might call malloc() internally, and since malloc() is also traced, this could 00031 * result in two calls to the callback function instead of one. */ 00032 static uint8_t trace_level; 00033 00034 /****************************************************************************** 00035 * Public interface 00036 *****************************************************************************/ 00037 00038 void mbed_mem_trace_set_callback(mbed_mem_trace_cb_t cb) { 00039 mem_trace_cb = cb; 00040 } 00041 00042 void *mbed_mem_trace_malloc(void *res, size_t size, void *caller) { 00043 if (mem_trace_cb) { 00044 if (core_util_atomic_incr_u8(&trace_level, 1) == 1) { 00045 mem_trace_cb(MBED_MEM_TRACE_MALLOC, res, caller, size); 00046 } 00047 core_util_atomic_decr_u8(&trace_level, 1); 00048 } 00049 return res; 00050 } 00051 00052 void *mbed_mem_trace_realloc(void *res, void *ptr, size_t size, void *caller) { 00053 if (mem_trace_cb) { 00054 if (core_util_atomic_incr_u8(&trace_level, 1) == 1) { 00055 mem_trace_cb(MBED_MEM_TRACE_REALLOC, res, caller, ptr, size); 00056 } 00057 core_util_atomic_decr_u8(&trace_level, 1); 00058 } 00059 return res; 00060 } 00061 00062 void *mbed_mem_trace_calloc(void *res, size_t num, size_t size, void *caller) { 00063 if (mem_trace_cb) { 00064 if (core_util_atomic_incr_u8(&trace_level, 1) == 1) { 00065 mem_trace_cb(MBED_MEM_TRACE_CALLOC, res, caller, num, size); 00066 } 00067 core_util_atomic_decr_u8(&trace_level, 1); 00068 } 00069 return res; 00070 } 00071 00072 void mbed_mem_trace_free(void *ptr, void *caller) { 00073 if (mem_trace_cb) { 00074 if (core_util_atomic_incr_u8(&trace_level, 1) == 1) { 00075 mem_trace_cb(MBED_MEM_TRACE_FREE, NULL, caller, ptr); 00076 } 00077 core_util_atomic_decr_u8(&trace_level, 1); 00078 } 00079 } 00080 00081 void mbed_mem_trace_default_callback(uint8_t op, void *res, void *caller, ...) { 00082 va_list va; 00083 size_t temp_s1, temp_s2; 00084 void *temp_ptr; 00085 00086 va_start(va, caller); 00087 switch(op) { 00088 case MBED_MEM_TRACE_MALLOC: 00089 temp_s1 = va_arg(va, size_t); 00090 printf(MBED_MEM_DEFAULT_TRACER_PREFIX "m:%p;%p-%u\n", res, caller, temp_s1); 00091 break; 00092 00093 case MBED_MEM_TRACE_REALLOC: 00094 temp_ptr = va_arg(va, void*); 00095 temp_s1 = va_arg(va, size_t); 00096 printf(MBED_MEM_DEFAULT_TRACER_PREFIX "r:%p;%p-%p;%u\n", res, caller, temp_ptr, temp_s1); 00097 break; 00098 00099 case MBED_MEM_TRACE_CALLOC: 00100 temp_s1 = va_arg(va, size_t); 00101 temp_s2 = va_arg(va, size_t); 00102 printf(MBED_MEM_DEFAULT_TRACER_PREFIX "c:%p;%p-%u;%u\n", res, caller, temp_s1, temp_s2); 00103 break; 00104 00105 case MBED_MEM_TRACE_FREE: 00106 temp_ptr = va_arg(va, void*); 00107 printf(MBED_MEM_DEFAULT_TRACER_PREFIX "f:%p;%p-%p\n", res, caller, temp_ptr); 00108 break; 00109 00110 default: 00111 printf("?\n"); 00112 } 00113 va_end(va); 00114 } 00115
Generated on Wed Jul 13 2022 02:23:48 by 1.7.2