*improved memory pool.

This commit is contained in:
Wang Renxin 2015-10-12 20:08:27 +08:00
parent 7b71bee735
commit 7c5dce6454

View File

@ -102,10 +102,18 @@ static struct mb_interpreter_t* bas = 0;
*/ */
#ifdef _USE_MEM_POOL #ifdef _USE_MEM_POOL
extern const size_t MB_SIZEOF_4BYTES;
extern const size_t MB_SIZEOF_8BYTES;
extern const size_t MB_SIZEOF_32BYTES;
extern const size_t MB_SIZEOF_64BYTES;
extern const size_t MB_SIZEOF_128BYTES;
extern const size_t MB_SIZEOF_256BYTES;
extern const size_t MB_SIZEOF_512BYTES;
extern const size_t MB_SIZEOF_INT; extern const size_t MB_SIZEOF_INT;
extern const size_t MB_SIZEOF_PTR; extern const size_t MB_SIZEOF_PTR;
extern const size_t MB_SIZEOF_LSN; extern const size_t MB_SIZEOF_LSN;
extern const size_t MB_SIZEOF_HTN; extern const size_t MB_SIZEOF_HTN;
extern const size_t MB_SIZEOF_HTA;
extern const size_t MB_SIZEOF_OBJ; extern const size_t MB_SIZEOF_OBJ;
extern const size_t MB_SIZEOF_FUN; extern const size_t MB_SIZEOF_FUN;
extern const size_t MB_SIZEOF_ARR; extern const size_t MB_SIZEOF_ARR;
@ -131,6 +139,7 @@ static int pool_count = 0;
static _pool_t* pool = 0; static _pool_t* pool = 0;
static long alloc_count = 0; static long alloc_count = 0;
static long alloc_bytes = 0;
#define _POOL_NODE_ALLOC(size) (((char*)malloc(sizeof(_pool_tag_t) + size)) + sizeof(_pool_tag_t)) #define _POOL_NODE_ALLOC(size) (((char*)malloc(sizeof(_pool_tag_t) + size)) + sizeof(_pool_tag_t))
#define _POOL_NODE_PTR(s) (s - sizeof(_pool_tag_t)) #define _POOL_NODE_PTR(s) (s - sizeof(_pool_tag_t))
@ -139,7 +148,7 @@ static long alloc_count = 0;
#define _POOL_NODE_FREE(s) free(_POOL_NODE_PTR(s)) #define _POOL_NODE_FREE(s) free(_POOL_NODE_PTR(s))
static void _open_mem_pool(void) { static void _open_mem_pool(void) {
#define N 11 #define N 19
size_t szs[N]; size_t szs[N];
size_t lst[N]; size_t lst[N];
int i = 0; int i = 0;
@ -148,17 +157,25 @@ static void _open_mem_pool(void) {
pool_count = 0; pool_count = 0;
szs[0] = MB_SIZEOF_INT; szs[0] = MB_SIZEOF_4BYTES;
szs[1] = MB_SIZEOF_PTR; szs[1] = MB_SIZEOF_8BYTES;
szs[2] = MB_SIZEOF_LSN; szs[2] = MB_SIZEOF_32BYTES;
szs[3] = MB_SIZEOF_HTN; szs[3] = MB_SIZEOF_64BYTES;
szs[4] = MB_SIZEOF_OBJ; szs[4] = MB_SIZEOF_128BYTES;
szs[5] = MB_SIZEOF_FUN; szs[5] = MB_SIZEOF_256BYTES;
szs[6] = MB_SIZEOF_ARR; szs[6] = MB_SIZEOF_512BYTES;
szs[7] = MB_SIZEOF_VAR; szs[7] = MB_SIZEOF_INT;
szs[8] = MB_SIZEOF_LBL; szs[8] = MB_SIZEOF_PTR;
szs[9] = MB_SIZEOF_RTN; szs[9] = MB_SIZEOF_LSN;
szs[10] = MB_SIZEOF_CLS; szs[10] = MB_SIZEOF_HTN;
szs[11] = MB_SIZEOF_HTA;
szs[12] = MB_SIZEOF_OBJ;
szs[13] = MB_SIZEOF_FUN;
szs[14] = MB_SIZEOF_ARR;
szs[15] = MB_SIZEOF_VAR;
szs[16] = MB_SIZEOF_LBL;
szs[17] = MB_SIZEOF_RTN;
szs[18] = MB_SIZEOF_CLS;
memset(lst, 0, sizeof(lst)); memset(lst, 0, sizeof(lst));
@ -209,23 +226,24 @@ static char* _pop_mem(unsigned s) {
_pool_t* pl = 0; _pool_t* pl = 0;
char* result = 0; char* result = 0;
++alloc_count;
alloc_bytes += s;
if(pool_count) { if(pool_count) {
for(i = 0; i < pool_count; i++) { for(i = 0; i < pool_count; i++) {
pl = &pool[i]; pl = &pool[i];
if(s == pl->size) { if(s <= pl->size) {
if(pl->stack) { if(pl->stack) {
/* Pop from stack */ /* Pop from stack */
result = pl->stack; result = pl->stack;
pl->stack = _POOL_NODE_NEXT(result); pl->stack = _POOL_NODE_NEXT(result);
_POOL_NODE_SIZE(result) = (_pool_chunk_size_t)s; _POOL_NODE_SIZE(result) = (_pool_chunk_size_t)s;
++alloc_count;
return result; return result;
} else { } else {
/* Create a new node */ /* Create a new node */
result = _POOL_NODE_ALLOC(s); result = _POOL_NODE_ALLOC(pl->size);
_POOL_NODE_SIZE(result) = (_pool_chunk_size_t)s; _POOL_NODE_SIZE(result) = (_pool_chunk_size_t)s;
++alloc_count;
return result; return result;
} }
@ -235,8 +253,7 @@ static char* _pop_mem(unsigned s) {
/* Allocate directly */ /* Allocate directly */
result = _POOL_NODE_ALLOC(s); result = _POOL_NODE_ALLOC(s);
_POOL_NODE_SIZE(result) = (_pool_chunk_size_t)0; _POOL_NODE_SIZE(result) = (_pool_chunk_size_t)s;
++alloc_count;
return result; return result;
} }
@ -248,11 +265,12 @@ static void _push_mem(char* p) {
if(--alloc_count < 0) { if(--alloc_count < 0) {
mb_assert(0 && "Multiple free"); mb_assert(0 && "Multiple free");
} }
alloc_bytes -= _POOL_NODE_SIZE(p);
if(pool_count) { if(pool_count) {
for(i = 0; i < pool_count; i++) { for(i = 0; i < pool_count; i++) {
pl = &pool[i]; pl = &pool[i];
if(_POOL_NODE_SIZE(p) == pl->size) { if(_POOL_NODE_SIZE(p) <= pl->size) {
/* Push to stack */ /* Push to stack */
_POOL_NODE_NEXT(p) = pl->stack; _POOL_NODE_NEXT(p) = pl->stack;
pl->stack = p; pl->stack = p;
@ -695,7 +713,7 @@ static void _run_file(char* path) {
if(mb_load_file(bas, path) == MB_FUNC_OK) { if(mb_load_file(bas, path) == MB_FUNC_OK) {
mb_run(bas); mb_run(bas);
} else { } else {
_printf("Invalid file or error code.\n"); _printf("Invalid file or wrong program.\n");
} }
} }
@ -853,7 +871,7 @@ static void _on_exit(void) {
#if defined _MSC_VER && !defined _WIN64 #if defined _MSC_VER && !defined _WIN64
if(0 != _CrtDumpMemoryLeaks()) { _asm { int 3 } } if(0 != _CrtDumpMemoryLeaks()) { _asm { int 3 } }
#elif defined _USE_MEM_POOL #elif defined _USE_MEM_POOL
if(alloc_count > 0) { mb_assert(0 && "Memory leak"); } if(alloc_count > 0 || alloc_bytes > 0) { mb_assert(0 && "Memory leak"); }
#endif /* _MSC_VER && !_WIN64 */ #endif /* _MSC_VER && !_WIN64 */
} }