public void Free(StagingBlock block)
        {
            bool clearArray = false;

#if DEBUG
            clearArray = true;
#endif
            _arrayPool.Return(block.Array, clearArray);
        }
Exemple #2
0
        private void Allocate(uint sizeInBytes, out StagingBlock stagingBlock)
        {
            uint   capacity = Math.Max(MinimumCapacity, sizeInBytes);
            IntPtr ptr      = Marshal.AllocHGlobal((int)capacity);
            uint   id       = (uint)_storage.Count;

            stagingBlock = new StagingBlock(id, (void *)ptr, capacity, sizeInBytes);
            _storage.Add(stagingBlock);
        }
Exemple #3
0
 public void Free(StagingBlock block)
 {
     lock (_lock)
     {
         if (!_disposed)
         {
             Debug.Assert(block.Id < _storage.Count);
             _availableBlocks.Add(block.Capacity, block.Id);
         }
     }
 }
Exemple #4
0
        private void Rent(uint size, out StagingBlock block)
        {
            lock (_lock)
            {
                SortedList <uint, uint> available = _availableBlocks;
                IList <uint>            indices   = available.Values;
                for (int i = 0; i < available.Count; i++)
                {
                    int          index   = (int)indices[i];
                    StagingBlock current = _storage[index];
                    if (current.Capacity >= size)
                    {
                        available.RemoveAt(i);
                        current.SizeInBytes = size;
                        block           = current;
                        _storage[index] = current;
                        return;
                    }
                }

                Allocate(size, out block);
            }
        }