xeye_ atsu
/
FRDM_RaVem_JVM
JVM test
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Tue Jul 12 2022 21:16:03 by 1.7.2