예제 #1
0
static void
split_block_and_add_to_lists(MemPool_t *pool, void *pRawMemory, byte firstListNum, byte memoryLogSize)
{
	void *p_memory = (char*) pRawMemory + (1U << (memoryLogSize - 1)); //set pointer to second half
	byte i = memoryLogSize - 1;
	for (; i >= firstListNum; --i)
	{
		add_block_to_list(pool, p_memory, i);
		p_memory = (char*) p_memory - (1U << (i - 1)); //leave other half for next iteration
	}

	add_block_to_list(pool, pRawMemory, firstListNum);
}
예제 #2
0
void
k_pool_release(MemPool_t *pool, ptr_t block)
{
	if (!block || !pool)
		return;

	struct BlockHeader_t *pHeader = (struct BlockHeader_t *) block - 1;

	byte listNum = pHeader->listNum;
	add_block_to_list(pool, pHeader, listNum);
	pool->numAllocatedBlocks[listNum]--;
}
예제 #3
0
파일: mm.c 프로젝트: sunpan9209/15213
/*
 * free
 */
void free (void *ptr) {
    size_t size;
    void* block;
    int index;

    checkheap(1);

    if (ptr == NULL) {
        return;
    }
    if(heap_start == 0)
                mm_init();
    block = block_from_ptr(ptr);
    index = coalesce(block, &size);

    block_mark(block, 1);
    //set_prev_pointer(block, NULL);
    //set_next_pointer(block, NULL);

    add_block_to_list(index, block);

    checkheap(1);
    return;    
}