xeye_ atsu
/
FRDM_RaVem_JVM
JVM test
pool.cpp@7:2a384a077520, 2013-08-29 (annotated)
- Committer:
- lynxeyed_atsu
- Date:
- Thu Aug 29 13:31:23 2013 +0000
- Revision:
- 7:2a384a077520
- Parent:
- 5:047542b65d00
fixed memory pool manager to re-use freed memory
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lynxeyed_atsu | 5:047542b65d00 | 1 | #include <stdio.h> |
lynxeyed_atsu | 5:047542b65d00 | 2 | #include "pool.h" |
lynxeyed_atsu | 5:047542b65d00 | 3 | |
lynxeyed_atsu | 5:047542b65d00 | 4 | |
lynxeyed_atsu | 5:047542b65d00 | 5 | int pl_buf[pool_size]; |
lynxeyed_atsu | 5:047542b65d00 | 6 | pool_all poal; |
lynxeyed_atsu | 5:047542b65d00 | 7 | |
lynxeyed_atsu | 7:2a384a077520 | 8 | |
lynxeyed_atsu | 7:2a384a077520 | 9 | int *pool_memmove(int size){ |
lynxeyed_atsu | 7:2a384a077520 | 10 | int *pointr; |
lynxeyed_atsu | 7:2a384a077520 | 11 | pool_each poeh; |
lynxeyed_atsu | 7:2a384a077520 | 12 | size = (size + (sizeof(int) - 1)) / sizeof(int); //round int type alignment |
lynxeyed_atsu | 7:2a384a077520 | 13 | poal.first_pointer = &pl_buf[0]; |
lynxeyed_atsu | 7:2a384a077520 | 14 | |
lynxeyed_atsu | 7:2a384a077520 | 15 | //seek pool_each header |
lynxeyed_atsu | 7:2a384a077520 | 16 | pointr = poal.first_pointer + (int)((sizeof(pool_all) + (sizeof(int) - 1)) / sizeof(int)); |
lynxeyed_atsu | 7:2a384a077520 | 17 | |
lynxeyed_atsu | 7:2a384a077520 | 18 | //todo: add magic number |
lynxeyed_atsu | 7:2a384a077520 | 19 | while(1){ |
lynxeyed_atsu | 7:2a384a077520 | 20 | memcpy(&poeh, pointr, sizeof(pool_each)); |
lynxeyed_atsu | 7:2a384a077520 | 21 | if((poeh.my_size == 0)||(pointr >= poal.next_pointer)){return NULL;} |
lynxeyed_atsu | 7:2a384a077520 | 22 | |
lynxeyed_atsu | 7:2a384a077520 | 23 | if(poeh.available == memory_invalid){ |
lynxeyed_atsu | 7:2a384a077520 | 24 | if(size <= poeh.my_size){ |
lynxeyed_atsu | 7:2a384a077520 | 25 | // seek data_header |
lynxeyed_atsu | 7:2a384a077520 | 26 | poeh.available = memory_available; |
lynxeyed_atsu | 7:2a384a077520 | 27 | memcpy(pointr, &poeh, sizeof(pool_each)); |
lynxeyed_atsu | 7:2a384a077520 | 28 | |
lynxeyed_atsu | 7:2a384a077520 | 29 | pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); |
lynxeyed_atsu | 7:2a384a077520 | 30 | return pointr; |
lynxeyed_atsu | 7:2a384a077520 | 31 | } |
lynxeyed_atsu | 7:2a384a077520 | 32 | } |
lynxeyed_atsu | 7:2a384a077520 | 33 | pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)) + poeh.my_size; |
lynxeyed_atsu | 7:2a384a077520 | 34 | } |
lynxeyed_atsu | 7:2a384a077520 | 35 | |
lynxeyed_atsu | 7:2a384a077520 | 36 | |
lynxeyed_atsu | 7:2a384a077520 | 37 | } |
lynxeyed_atsu | 5:047542b65d00 | 38 | void pool_init(void){ |
lynxeyed_atsu | 5:047542b65d00 | 39 | poal.first_pointer = &pl_buf[0]; |
lynxeyed_atsu | 5:047542b65d00 | 40 | poal.pool_size_all = pool_size; |
lynxeyed_atsu | 5:047542b65d00 | 41 | |
lynxeyed_atsu | 5:047542b65d00 | 42 | poal.available = memory_available; |
lynxeyed_atsu | 5:047542b65d00 | 43 | poal.next_pointer = &pl_buf[(int)((sizeof(pool_all) + (sizeof(int) - 1)) / sizeof(int))]; |
lynxeyed_atsu | 5:047542b65d00 | 44 | memcpy(poal.first_pointer, &poal, sizeof(pool_all)); //todo: change 'pl_buf' pointer |
lynxeyed_atsu | 5:047542b65d00 | 45 | |
lynxeyed_atsu | 5:047542b65d00 | 46 | } |
lynxeyed_atsu | 5:047542b65d00 | 47 | |
lynxeyed_atsu | 5:047542b65d00 | 48 | int *pool_alloc(int size){ |
lynxeyed_atsu | 7:2a384a077520 | 49 | pool_each poeh; |
lynxeyed_atsu | 7:2a384a077520 | 50 | int *pointr; |
lynxeyed_atsu | 5:047542b65d00 | 51 | |
lynxeyed_atsu | 7:2a384a077520 | 52 | if(NULL != (pointr = pool_memmove(size)))return pointr; |
lynxeyed_atsu | 5:047542b65d00 | 53 | size = (size + (sizeof(int) - 1)) / sizeof(int); //round int type alignment |
lynxeyed_atsu | 7:2a384a077520 | 54 | |
lynxeyed_atsu | 5:047542b65d00 | 55 | poal.pool_size_all = poal.pool_size_all - ((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)) - size; // int alignment |
lynxeyed_atsu | 5:047542b65d00 | 56 | |
lynxeyed_atsu | 5:047542b65d00 | 57 | if(poal.pool_size_all <= 0){ |
lynxeyed_atsu | 5:047542b65d00 | 58 | uart_print("malloc error!\r\n"); |
lynxeyed_atsu | 5:047542b65d00 | 59 | return NULL; |
lynxeyed_atsu | 5:047542b65d00 | 60 | } |
lynxeyed_atsu | 5:047542b65d00 | 61 | |
lynxeyed_atsu | 5:047542b65d00 | 62 | poeh.my_size = size; |
lynxeyed_atsu | 5:047542b65d00 | 63 | #if defined(USE_MAGIC) |
lynxeyed_atsu | 5:047542b65d00 | 64 | poeh.magic_num = magic_value; |
lynxeyed_atsu | 5:047542b65d00 | 65 | #endif |
lynxeyed_atsu | 5:047542b65d00 | 66 | poeh.available = memory_available; |
lynxeyed_atsu | 5:047542b65d00 | 67 | pointr = poal.next_pointer + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); |
lynxeyed_atsu | 5:047542b65d00 | 68 | |
lynxeyed_atsu | 5:047542b65d00 | 69 | poeh.this_pointer = &pointr; |
lynxeyed_atsu | 5:047542b65d00 | 70 | |
lynxeyed_atsu | 5:047542b65d00 | 71 | memcpy(poal.next_pointer, &poeh, sizeof(pool_each)); //todo: change 'pl_buf' pointer |
lynxeyed_atsu | 5:047542b65d00 | 72 | poal.next_pointer = pointr + size; |
lynxeyed_atsu | 5:047542b65d00 | 73 | |
lynxeyed_atsu | 5:047542b65d00 | 74 | return pointr; |
lynxeyed_atsu | 5:047542b65d00 | 75 | } |
lynxeyed_atsu | 5:047542b65d00 | 76 | |
lynxeyed_atsu | 5:047542b65d00 | 77 | void pool_free(int *pointr){ |
lynxeyed_atsu | 5:047542b65d00 | 78 | if (pointr == NULL)return; |
lynxeyed_atsu | 5:047542b65d00 | 79 | pool_each poeh; |
lynxeyed_atsu | 5:047542b65d00 | 80 | |
lynxeyed_atsu | 5:047542b65d00 | 81 | pointr = pointr - (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align header |
lynxeyed_atsu | 5:047542b65d00 | 82 | memcpy(&poeh,pointr,sizeof(pool_each)); |
lynxeyed_atsu | 5:047542b65d00 | 83 | #if defined(USE_MAGIC) |
lynxeyed_atsu | 5:047542b65d00 | 84 | if (poeh.magic_num != magic_value){ |
lynxeyed_atsu | 5:047542b65d00 | 85 | uart_print("pointer error\r\n"); |
lynxeyed_atsu | 5:047542b65d00 | 86 | return; |
lynxeyed_atsu | 5:047542b65d00 | 87 | } |
lynxeyed_atsu | 5:047542b65d00 | 88 | #endif |
lynxeyed_atsu | 5:047542b65d00 | 89 | poeh.available = memory_invalid; |
lynxeyed_atsu | 5:047542b65d00 | 90 | memcpy(pointr, &poeh, sizeof(pool_each)); |
lynxeyed_atsu | 5:047542b65d00 | 91 | return; |
lynxeyed_atsu | 5:047542b65d00 | 92 | |
lynxeyed_atsu | 5:047542b65d00 | 93 | } |
lynxeyed_atsu | 5:047542b65d00 | 94 | |
lynxeyed_atsu | 5:047542b65d00 | 95 | int *pool_realloc(int *pointr, int size){ |
lynxeyed_atsu | 5:047542b65d00 | 96 | |
lynxeyed_atsu | 5:047542b65d00 | 97 | int *new_pointr; |
lynxeyed_atsu | 5:047542b65d00 | 98 | |
lynxeyed_atsu | 5:047542b65d00 | 99 | if(pointr == NULL)return NULL; |
lynxeyed_atsu | 5:047542b65d00 | 100 | pool_each poeh; |
lynxeyed_atsu | 5:047542b65d00 | 101 | size = (size + (sizeof(int) - 1)) / sizeof(int); //round int type alignment |
lynxeyed_atsu | 5:047542b65d00 | 102 | |
lynxeyed_atsu | 5:047542b65d00 | 103 | pointr = pointr - (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align header |
lynxeyed_atsu | 5:047542b65d00 | 104 | |
lynxeyed_atsu | 5:047542b65d00 | 105 | memcpy(&poeh,pointr,sizeof(pool_each)); |
lynxeyed_atsu | 5:047542b65d00 | 106 | #if defined(USE_MAGIC) |
lynxeyed_atsu | 5:047542b65d00 | 107 | if (poeh.magic_num != magic_value){ |
lynxeyed_atsu | 5:047542b65d00 | 108 | uart_print("pointer error\r\n"); |
lynxeyed_atsu | 5:047542b65d00 | 109 | return NULL; |
lynxeyed_atsu | 5:047542b65d00 | 110 | } |
lynxeyed_atsu | 5:047542b65d00 | 111 | #endif |
lynxeyed_atsu | 5:047542b65d00 | 112 | if (poeh.my_size >= size){ |
lynxeyed_atsu | 5:047542b65d00 | 113 | |
lynxeyed_atsu | 5:047542b65d00 | 114 | poeh.my_size = size; |
lynxeyed_atsu | 5:047542b65d00 | 115 | memcpy(pointr, &poeh, sizeof(pool_each)); |
lynxeyed_atsu | 5:047542b65d00 | 116 | pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align pointer |
lynxeyed_atsu | 5:047542b65d00 | 117 | return pointr; |
lynxeyed_atsu | 5:047542b65d00 | 118 | |
lynxeyed_atsu | 5:047542b65d00 | 119 | } |
lynxeyed_atsu | 5:047542b65d00 | 120 | poeh.available = memory_invalid; |
lynxeyed_atsu | 5:047542b65d00 | 121 | memcpy(pointr, &poeh, sizeof(pool_each)); |
lynxeyed_atsu | 5:047542b65d00 | 122 | |
lynxeyed_atsu | 5:047542b65d00 | 123 | new_pointr = (int *)pool_alloc(sizeof(int) * size); |
lynxeyed_atsu | 5:047542b65d00 | 124 | pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align pointer |
lynxeyed_atsu | 5:047542b65d00 | 125 | |
lynxeyed_atsu | 5:047542b65d00 | 126 | memcpy(new_pointr, pointr, sizeof(int) * poeh.my_size); |
lynxeyed_atsu | 5:047542b65d00 | 127 | |
lynxeyed_atsu | 5:047542b65d00 | 128 | return new_pointr; |
lynxeyed_atsu | 5:047542b65d00 | 129 | } |
lynxeyed_atsu | 5:047542b65d00 | 130 | |
lynxeyed_atsu | 5:047542b65d00 | 131 |