JVM test

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers pool.cpp Source File

pool.cpp

00001 #include <stdio.h>
00002 #include "pool.h"
00003 
00004 
00005 int pl_buf[pool_size];
00006 pool_all poal;
00007 
00008 
00009 int *pool_memmove(int size){
00010     int *pointr;
00011     pool_each poeh;
00012     size = (size + (sizeof(int) - 1)) / sizeof(int); //round int type alignment
00013     poal.first_pointer = &pl_buf[0];
00014     
00015     //seek pool_each header
00016     pointr = poal.first_pointer + (int)((sizeof(pool_all) + (sizeof(int) - 1)) / sizeof(int));
00017     
00018     //todo: add magic number
00019     while(1){
00020         memcpy(&poeh, pointr, sizeof(pool_each));
00021         if((poeh.my_size == 0)||(pointr >= poal.next_pointer)){return NULL;}
00022         
00023         if(poeh.available == memory_invalid){
00024             if(size <= poeh.my_size){
00025                 // seek data_header
00026                 poeh.available = memory_available;
00027                 memcpy(pointr, &poeh, sizeof(pool_each));
00028                 
00029                 pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int));
00030                 return pointr;
00031             }
00032         }
00033         pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)) + poeh.my_size;
00034     }
00035     
00036     
00037 }
00038 void pool_init(void){    
00039     poal.first_pointer = &pl_buf[0];
00040     poal.pool_size_all = pool_size;
00041     
00042     poal.available = memory_available;
00043     poal.next_pointer = &pl_buf[(int)((sizeof(pool_all) + (sizeof(int) - 1)) / sizeof(int))];
00044     memcpy(poal.first_pointer, &poal, sizeof(pool_all)); //todo: change 'pl_buf' pointer
00045 
00046 }
00047 
00048 int *pool_alloc(int size){
00049     pool_each poeh;
00050     int *pointr;
00051     
00052     if(NULL != (pointr = pool_memmove(size)))return pointr;  
00053     size = (size + (sizeof(int) - 1)) / sizeof(int); //round int type alignment
00054 
00055     poal.pool_size_all = poal.pool_size_all - ((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)) - size; // int alignment
00056     
00057     if(poal.pool_size_all <= 0){
00058         uart_print("malloc error!\r\n");
00059         return NULL;
00060     }
00061     
00062     poeh.my_size = size;
00063 #if defined(USE_MAGIC)
00064     poeh.magic_num = magic_value;
00065 #endif
00066     poeh.available  = memory_available;
00067     pointr = poal.next_pointer + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int));
00068 
00069     poeh.this_pointer = &pointr;
00070     
00071     memcpy(poal.next_pointer, &poeh, sizeof(pool_each)); //todo: change 'pl_buf' pointer
00072     poal.next_pointer = pointr + size;
00073 
00074     return pointr;
00075 }
00076 
00077 void pool_free(int *pointr){
00078     if (pointr == NULL)return;
00079     pool_each poeh;
00080     
00081     pointr = pointr - (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align header
00082     memcpy(&poeh,pointr,sizeof(pool_each));
00083 #if defined(USE_MAGIC)
00084     if (poeh.magic_num != magic_value){
00085         uart_print("pointer error\r\n");
00086         return;
00087     }
00088 #endif
00089     poeh.available = memory_invalid;
00090     memcpy(pointr, &poeh, sizeof(pool_each));
00091     return;
00092     
00093 }
00094 
00095 int *pool_realloc(int *pointr, int size){
00096 
00097     int *new_pointr;
00098     
00099     if(pointr == NULL)return NULL;
00100     pool_each poeh;
00101     size = (size + (sizeof(int) - 1)) / sizeof(int); //round int type alignment
00102     
00103     pointr = pointr - (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align header
00104     
00105     memcpy(&poeh,pointr,sizeof(pool_each));
00106 #if defined(USE_MAGIC)
00107     if (poeh.magic_num != magic_value){
00108         uart_print("pointer error\r\n");
00109         return NULL;
00110     }
00111 #endif
00112     if (poeh.my_size >= size){
00113         
00114         poeh.my_size = size;
00115         memcpy(pointr, &poeh, sizeof(pool_each));
00116         pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align pointer
00117         return pointr;
00118         
00119     }
00120     poeh.available = memory_invalid;
00121     memcpy(pointr, &poeh, sizeof(pool_each));
00122 
00123     new_pointr = (int *)pool_alloc(sizeof(int) * size);
00124     pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align pointer
00125 
00126     memcpy(new_pointr, pointr, sizeof(int) * poeh.my_size);
00127     
00128     return new_pointr;
00129 }
00130 
00131