// Remove Fragmentation in FreeMemList static void MergeFragmentation(UINT8 inst_no) { FREE_MEM_T *node1, *node2; node1 = FreeMemHead; while(node1 != FreeMemTail){ node2 = FreeMemHead; while(node2 != FreeMemTail){ if(node1->startAddr + node1->size == node2->startAddr){ node1->size += node2->size; printD("find merge area !! ( node1->startAddr + node1->size == node2->startAddr)\n"); DeleteNodeFromFreeList(node2, inst_no); break; } else if(node1->startAddr == node2->startAddr + node2->size){ printD("find merge area !! ( node1->startAddr == node2->startAddr + node2->size)\n"); node1->startAddr = node2->startAddr; node1->size += node2->size; DeleteNodeFromFreeList(node2, inst_no); break; } node2 = node2->next; } node1 = node1->next; } }
// Remove Fragmentation in FreeMemList static void MergeFragmentation(int inst_no) { FREE_MEM_T *node1, *node2; node1 = FreeMemHead; while(node1 != FreeMemTail){ node2 = FreeMemHead; while(node2 != FreeMemTail){ if( (node1->startAddr + node1->size == node2->startAddr) && (node1->cacheFlag == node2->cacheFlag) ){ node1->size += node2->size; LOG_MSG(LOG_TRACE, "MergeFragmentation", "find merge area !! ( node1->startAddr + node1->size == node2->startAddr)\n"); DeleteNodeFromFreeList(node2, inst_no); break; } else if( (node1->startAddr == node2->startAddr + node2->size) && (node1->cacheFlag == node2->cacheFlag) ){ LOG_MSG(LOG_TRACE, "MergeFragmentation", "find merge area !! ( node1->startAddr == node2->startAddr + node2->size)\n"); node1->startAddr = node2->startAddr; node1->size += node2->size; DeleteNodeFromFreeList(node2, inst_no); break; } node2 = node2->next; } node1 = node1->next; } }
static DWORD GetMemArea(UINT32 allocSize, UINT8 inst_no) { FREE_MEM_T *node, *match_node = NULL; DWORD allocAddr = 0; int i = 0; printD("request Size : %ld\n", allocSize); if(FreeMemHead == FreeMemTail){ RETAILMSG(1, (TEXT("All memory is gone\r\n"))); return(allocAddr); } // find best chunk of memory for(node = FreeMemHead; node != FreeMemTail; node = node->next){ if(match_node != NULL){ if((node->size >= allocSize) && (node->size < match_node->size)) match_node = node; } else{ if(node->size >= allocSize) match_node = node; } } printD("match : startAddr(0x%08x) size(%ld)\n", match_node->startAddr, match_node->size); // rearange FreeMemArea if(match_node != NULL){ allocAddr = match_node->startAddr; match_node->startAddr += allocSize; match_node->size -= allocSize; if(match_node->size == 0) // delete match_node. DeleteNodeFromFreeList(match_node, inst_no); return(allocAddr); } else RETAILMSG(1, (TEXT("there is no suitable chunk\r\n"))); return(allocAddr); }
static unsigned int GetMemArea(int allocSize, int inst_no, char cache_flag) { FREE_MEM_T *node, *match_node = NULL; unsigned int allocAddr = 0; LOG_MSG(LOG_TRACE, "GetMemArea", "request Size : %ld\n", allocSize); if(FreeMemHead == FreeMemTail){ LOG_MSG(LOG_ERROR, "GetMemArea", "all memory is gone\n"); return(allocAddr); } // find best chunk of memory for(node = FreeMemHead; node != FreeMemTail; node = node->next) { if(match_node != NULL) { if(cache_flag) { if( (node->size >= allocSize) && (node->size < match_node->size) && (node->cacheFlag) ) match_node = node; } else { if( (node->size >= allocSize) && (node->size < match_node->size) && (!node->cacheFlag) ) match_node = node; } } else { if(cache_flag) { if( (node->size >= allocSize) && (node->cacheFlag) ) match_node = node; } else { if( (node->size >= allocSize) && (!node->cacheFlag) ) match_node = node; } } } if(match_node != NULL) { LOG_MSG(LOG_TRACE, "GetMemArea", "match : startAddr(0x%08x) size(%ld) cache flag(%d)\n", \ match_node->startAddr, match_node->size, match_node->cacheFlag); } // rearange FreeMemArea if(match_node != NULL){ allocAddr = match_node->startAddr; match_node->startAddr += allocSize; match_node->size -= allocSize; if(match_node->size == 0) // delete match_node. DeleteNodeFromFreeList(match_node, inst_no); return(allocAddr); } else { LOG_MSG(LOG_ERROR, "GetMemArea", "there is no suitable chunk\n"); return 0; } return(allocAddr); }