Exemple #1
0
// 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;
	}
}
Exemple #3
0
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);
}