1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  | internal void *
AcquireAssetMemory(game_assets *Assets, memory_index Size)
{
    void *Result = 0;
    for(;;)
    {
        asset_memory_block *Block = FindBlockForSize(Assets, Size);
        if(Block)
        {
            Block->Flags |= AssetMemory_Used;
            
            Assert(Size <= Block->Size);
            Result = (u8 *)(Block + 1);
            memory_index RemainingSize = Block->Size - Size;
            memory_index BlockSplitThreshold = 4096; // TODO(casey): Set this based on the smallest asset?
            if(RemainingSize > BlockSplitThreshold)
            {
                Block->Size -= RemainingSize;
                InsertBlock(Block, RemainingSize, (u8 *)Result + Size);
            }
            else
            {
                // TODO(casey): Actually record the unused portion of the memory
                // in a block so that we can do the merge on blocks when neighbors
                // are freed.
            }
            
            break;
 | 
1 2 3 4 5 6  | +-----------------------+-------------+ | asset_memory_block | asset data | +-----------------------+-------------+ ^ ^ | | +--- Block pointer +-- Result pointer  |