Browse Source

memory clearing should not be UniformUnmanagedMemoryPool concern

af/UniformUnmanagedMemoryPoolMemoryAllocator-02-MemoryGuards
Anton Firszov 5 years ago
parent
commit
aadaefa800
  1. 7
      src/ImageSharp/Memory/Allocators/Internals/UniformUnmanagedMemoryPool.cs
  2. 15
      src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs

7
src/ImageSharp/Memory/Allocators/Internals/UniformUnmanagedMemoryPool.cs

@ -52,7 +52,7 @@ namespace SixLabors.ImageSharp.Memory.Internals
public int Capacity { get; } public int Capacity { get; }
public UnmanagedMemoryHandle Rent(AllocationOptions allocationOptions = AllocationOptions.None) public UnmanagedMemoryHandle Rent()
{ {
UnmanagedMemoryHandle[] buffersLocal = this.buffers; UnmanagedMemoryHandle[] buffersLocal = this.buffers;
@ -81,11 +81,6 @@ namespace SixLabors.ImageSharp.Memory.Internals
buffer = UnmanagedMemoryHandle.Allocate(this.BufferLength); buffer = UnmanagedMemoryHandle.Allocate(this.BufferLength);
} }
if (allocationOptions.Has(AllocationOptions.Clean))
{
this.GetSpan(buffer).Clear();
}
return buffer; return buffer;
} }

15
src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs

@ -98,10 +98,14 @@ namespace SixLabors.ImageSharp.Memory
if (lengthInBytes <= this.poolBufferSizeInBytes) if (lengthInBytes <= this.poolBufferSizeInBytes)
{ {
UnmanagedMemoryHandle array = this.pool.Rent(options); UnmanagedMemoryHandle array = this.pool.Rent();
if (array != null) if (array != null)
{ {
return new UniformUnmanagedMemoryPool.FinalizableBuffer<T>(this.pool, array, length); var buffer = new UniformUnmanagedMemoryPool.FinalizableBuffer<T>(this.pool, array, length);
if (options.Has(AllocationOptions.Clean))
{
buffer.Clear();
}
} }
} }
@ -124,10 +128,15 @@ namespace SixLabors.ImageSharp.Memory
if (totalLengthInBytes <= this.poolBufferSizeInBytes) if (totalLengthInBytes <= this.poolBufferSizeInBytes)
{ {
// Optimized path renting single array from the pool // Optimized path renting single array from the pool
UnmanagedMemoryHandle array = this.pool.Rent(options); UnmanagedMemoryHandle array = this.pool.Rent();
if (array != null) if (array != null)
{ {
var buffer = new UniformUnmanagedMemoryPool.FinalizableBuffer<T>(this.pool, array, (int)totalLength); var buffer = new UniformUnmanagedMemoryPool.FinalizableBuffer<T>(this.pool, array, (int)totalLength);
if (options.Has(AllocationOptions.Clean))
{
buffer.Clear();
}
return MemoryGroup<T>.CreateContiguous(buffer, options.Has(AllocationOptions.Clean)); return MemoryGroup<T>.CreateContiguous(buffer, options.Has(AllocationOptions.Clean));
} }
} }

Loading…
Cancel
Save