#if MAX_SIZE_MALLOC /************************************************* * function: find best fit node in max size **************************************************/
MNG_NODE* find_best_fit_node(unsigned int size) { MNG_NODE* pCur = pFreeList; MNG_NODE* pPre = pCur; MNG_NODE* pFind = NULL;
while(pCur) { if(pCur->size > (size + sizeof(MNG_NODE))) { if(NULL == pFind || pFind->size < pCur->size) { pFind = pCur; } }
pPre = pCur; pCur = pCur->next; }
if(NULL == pFind) return NULL;
pPre = find_previous_node_in_list(pFind, pFreeList); if(NULL == pPre) pFreeList = pFreeList->next; else pPre->next = pFind->next;
return pFind; } #endif
/************************************************* * function: implement memory allocation **************************************************/
static void* _mem_malloc(unsigned int size) { MNG_NODE* pOld; MNG_NODE* pNew;
pOld = find_best_fit_node(size); if(NULL == pOld) return NULL;
pNew = (MNG_NODE*)((char*)pOld + sizeof(MNG_NODE) + pOld->size - (sizeof(MNG_NODE) + size)); pNew->size = size; pOld->size -= sizeof(MNG_NODE) + size;
add_node_into_list_head(pOld, &pFreeList); add_node_into_list_head(pNew, &pAllocList);
return (void*)((char*)pNew + sizeof(MNG_NODE)); }
/************************************************* * function: memory allocation **************************************************/
void* mem_malloc(unsigned int size) { if(0 == size) return NULL;
if(size > (MEM_BUFFER_LENGTH - sizeof(MNG_NODE))) return NULL;
return _mem_malloc(size); }
/************************************************* * function: find previous node **************************************************/
MNG_NODE* find_previous_node_in_list(MNG_NODE* pNode, MNG_NODE* pList) { MNG_NODE* pFind = pList; MNG_NODE* pPre = NULL; while(pFind && pFind != pNode) { pPre = pFind; pFind = pFind->next; }
if(NULL == pFind) return NULL;
return pPre; } |