Toyomasa Watarai
/
Mbed-example-WS-W27
Mbed Cloud example program for workshop in W27 2018.
Embed:
(wiki syntax)
Show/hide line numbers
pal_memory.c
00001 /* 00002 * pal_memory.c 00003 * 00004 * Created on: Jun 26, 2017 00005 * Author: pal 00006 */ 00007 #ifdef PAL_MEMORY_STATISTICS 00008 #include "stdio.h" 00009 #include "mbed-trace/mbed_trace.h" 00010 00011 00012 #define TRACE_GROUP "PAL_MEMORY" 00013 00014 #define SMALL_BUCKET 32 00015 #define LARGE_BUCKET 4096 00016 00017 typedef enum _memoryBucketSizes 00018 { 00019 PAL_BUCKET_SIZE_32, 00020 PAL_BUCKET_SIZE_64, 00021 PAL_BUCKET_SIZE_128, 00022 PAL_BUCKET_SIZE_256, 00023 PAL_BUCKET_SIZE_512, 00024 PAL_BUCKET_SIZE_1024, 00025 PAL_BUCKET_SIZE_2048, 00026 PAL_BUCKET_SIZE_4096, 00027 PAL_BUCKET_SIZE_LARGE, 00028 PAL_BUCKET_NUMBER 00029 }memoryBucketSizes; 00030 00031 typedef struct _memoryAllocationData 00032 { 00033 int32_t totalsize; 00034 int32_t waterMark; 00035 int32_t buckets[PAL_BUCKET_NUMBER]; 00036 int32_t waterMarkBuckets[PAL_BUCKET_NUMBER]; 00037 }memoryAllocationData; 00038 00039 static memoryAllocationData memoryStats = {0}; 00040 00041 00042 static inline memoryBucketSizes getBucketNumber(size_t size) 00043 { 00044 if (size <= SMALL_BUCKET) 00045 { 00046 return PAL_BUCKET_SIZE_32; 00047 } 00048 if (size >= LARGE_BUCKET) 00049 { 00050 return PAL_BUCKET_SIZE_LARGE; 00051 } 00052 00053 uint8_t bucket = 1; 00054 uint32_t power = 64; // Starting with 32 00055 while (power < size) 00056 { 00057 bucket++; 00058 power*=2; 00059 } 00060 return bucket; 00061 } 00062 00063 00064 void* __wrap_malloc(size_t c) 00065 { 00066 void *ptr = __real_malloc(c + sizeof(size_t) + sizeof(size_t)); 00067 if (ptr == NULL) 00068 { 00069 return NULL; 00070 } 00071 int32_t currentTotal = pal_osAtomicIncrement((&memoryStats.totalsize),c); 00072 if (currentTotal > memoryStats.waterMark) 00073 { 00074 memoryStats.waterMark = currentTotal; // need to make this thread safe 00075 } 00076 00077 *(size_t*)ptr = c; 00078 ptr = ((size_t*)ptr+1); 00079 *(size_t*)ptr = (size_t)getBucketNumber(c); 00080 int32_t currentBucketTotal = pal_osAtomicIncrement(&(memoryStats.buckets[*(size_t*)ptr]),1); 00081 if (memoryStats.waterMarkBuckets[*(size_t*)ptr] < currentBucketTotal) 00082 { 00083 memoryStats.waterMarkBuckets[*(size_t*)ptr] = currentBucketTotal; 00084 } 00085 ptr = ((size_t*)ptr + 1); 00086 return ptr; 00087 } 00088 00089 00090 void __wrap_free(void* ptr) 00091 { 00092 if (NULL == ptr) 00093 { 00094 return; 00095 } 00096 ptr = ((size_t*)ptr-1); 00097 pal_osAtomicIncrement(&(memoryStats.buckets[*(size_t*)ptr]),-1); 00098 ptr = ((size_t*)ptr-1); 00099 pal_osAtomicIncrement((&memoryStats.totalsize),-1*(*(size_t*)ptr)); 00100 __real_free(ptr); 00101 } 00102 00103 00104 void* __wrap_calloc(size_t num, size_t size) 00105 { 00106 void* ptr = __wrap_malloc(num*size); 00107 if (NULL != ptr) 00108 { 00109 memset(ptr,0,(num*size)); 00110 } 00111 return (ptr); 00112 } 00113 00114 00115 void printMemoryStats(void) 00116 { 00117 tr_info("\n*******************************************************\r\n"); 00118 tr_info("water mark size = %ld\r\n",memoryStats.waterMark); 00119 tr_info("total size = %ld\r\n",memoryStats.totalsize); 00120 tr_info("bucket 32 allocation number %ld\r\n",memoryStats.buckets[0]); 00121 tr_info("bucket 64 allocation number %ld\r\n",memoryStats.buckets[1]); 00122 tr_info("bucket 128 allocation number %ld\r\n",memoryStats.buckets[2]); 00123 tr_info("bucket 258 allocation number %ld\r\n",memoryStats.buckets[3]); 00124 tr_info("bucket 512 allocation number %ld\r\n",memoryStats.buckets[4]); 00125 tr_info("bucket 1024 allocation number %ld\r\n",memoryStats.buckets[5]); 00126 tr_info("bucket 2048 allocation number %ld\r\n",memoryStats.buckets[6]); 00127 tr_info("bucket 4096 allocation number %ld\r\n",memoryStats.buckets[7]); 00128 tr_info("bucket large allocation number %ld\r\n",memoryStats.buckets[8]); 00129 00130 00131 tr_info("water mark bucket 32 allocation number %ld\r\n",memoryStats.waterMarkBuckets[0]); 00132 tr_info("water mark bucket 64 allocation number %ld\r\n",memoryStats.waterMarkBuckets[1]); 00133 tr_info("water mark bucket 128 allocation number %ld\r\n",memoryStats.waterMarkBuckets[2]); 00134 tr_info("water mark bucket 256 allocation number %ld\r\n",memoryStats.waterMarkBuckets[3]); 00135 tr_info("water mark bucket 512 allocation number %ld\r\n",memoryStats.waterMarkBuckets[4]); 00136 tr_info("water mark bucket 1024 allocation number %ld\r\n",memoryStats.waterMarkBuckets[5]); 00137 tr_info("water mark bucket 2048 allocation number %ld\r\n",memoryStats.waterMarkBuckets[6]); 00138 tr_info("water mark bucket 4096 allocation number %ld\r\n",memoryStats.waterMarkBuckets[7]); 00139 tr_info("water mark bucket large allocation number %ld\r\n",memoryStats.waterMarkBuckets[8]); 00140 tr_info("*******************************************************\r\n"); 00141 } 00142 #endif
Generated on Tue Jul 12 2022 16:22:09 by 1.7.2