Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. bool AudioPool::MemoryPool::Allocate(MemoryChunk & chunk, size_t size)
  2. {
  3.     size_t alignMask = (AUDREN_BUFFER_ALIGNMENT - 1);
  4.  
  5.     if (size && alignMask)
  6.     {
  7.         if (size > UINTPTR_MAX - alignMask)
  8.             return false;
  9.  
  10.         size = (size + alignMask) &~ alignMask;
  11.     }
  12.  
  13.     for (auto block = first; block; block = block->next)
  14.     {
  15.         auto address = block->base;
  16.  
  17.         size_t waste = (size_t)address & alignMask;
  18.         LOG("waste: %zu", waste);
  19.  
  20.         if (waste > 0)
  21.             waste = alignMask + 1 - waste;
  22.  
  23.         LOG("block size: %zu", block->size)
  24.         if (waste > block->size)
  25.             continue;
  26.  
  27.         address += waste;
  28.  
  29.         size_t blockSize = block->size - waste;
  30.         LOG("blockSize: %zu < size: %zu", blockSize, size);
  31.         if (blockSize < size)
  32.             continue;
  33.  
  34.         // found space
  35.         chunk.address = address;
  36.         chunk.size = size;
  37.  
  38.         if (!waste)
  39.         {
  40.             block->base += size;
  41.             block->size -= size;
  42.             LOG("No wasted space")
  43.             if (!block->size)
  44.                 AudioPool::MemoryPool::DeleteBlock(block);
  45.             LOG("Done!")
  46.         }
  47.         else
  48.         {
  49.             LOG("Wasted space!")
  50.             auto nextAddress = address + size;
  51.             auto nextSize = blockSize - size;
  52.  
  53.             block->size = waste;
  54.  
  55.             if (nextSize)
  56.             {
  57.                 LOG("Next size! Creating..")
  58.                 auto next = MemoryBlock::Create(nextAddress, nextSize);
  59.                 LOG("Done.")
  60.                 if (next)
  61.                     AudioPool::MemoryPool::InsertAfter(block, next);
  62.                 else
  63.                     chunk.size += nextSize;
  64.             }
  65.         }
  66.         LOG("allocated!")
  67.         return true;
  68.     }
  69.     LOG("failed to allocate")
  70.     return false;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement