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); }
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]--; }
/* * 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; }