Mbed Cloud example program for workshop in W27 2018.

Dependencies:   MMA7660 LM75B

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers pal_memory.c Source File

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