Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of TUKS-COURSE-TIMER by
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 Tue Jul 12 2022 17:38:48 by
