diff --git a/src/ImageSharp/Memory/Allocators/Internals/UniformUnmanagedMemoryPool.cs b/src/ImageSharp/Memory/Allocators/Internals/UniformUnmanagedMemoryPool.cs index cfb0b3eb5..3d5c0da2c 100644 --- a/src/ImageSharp/Memory/Allocators/Internals/UniformUnmanagedMemoryPool.cs +++ b/src/ImageSharp/Memory/Allocators/Internals/UniformUnmanagedMemoryPool.cs @@ -52,7 +52,7 @@ namespace SixLabors.ImageSharp.Memory.Internals public int Capacity { get; } - public UnmanagedMemoryHandle Rent(AllocationOptions allocationOptions = AllocationOptions.None) + public UnmanagedMemoryHandle Rent() { UnmanagedMemoryHandle[] buffersLocal = this.buffers; @@ -81,11 +81,6 @@ namespace SixLabors.ImageSharp.Memory.Internals buffer = UnmanagedMemoryHandle.Allocate(this.BufferLength); } - if (allocationOptions.Has(AllocationOptions.Clean)) - { - this.GetSpan(buffer).Clear(); - } - return buffer; } diff --git a/src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs index 3aa2bbf83..5fc563d09 100644 --- a/src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs +++ b/src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs @@ -98,10 +98,14 @@ namespace SixLabors.ImageSharp.Memory if (lengthInBytes <= this.poolBufferSizeInBytes) { - UnmanagedMemoryHandle array = this.pool.Rent(options); + UnmanagedMemoryHandle array = this.pool.Rent(); if (array != null) { - return new UniformUnmanagedMemoryPool.FinalizableBuffer(this.pool, array, length); + var buffer = new UniformUnmanagedMemoryPool.FinalizableBuffer(this.pool, array, length); + if (options.Has(AllocationOptions.Clean)) + { + buffer.Clear(); + } } } @@ -124,10 +128,15 @@ namespace SixLabors.ImageSharp.Memory if (totalLengthInBytes <= this.poolBufferSizeInBytes) { // Optimized path renting single array from the pool - UnmanagedMemoryHandle array = this.pool.Rent(options); + UnmanagedMemoryHandle array = this.pool.Rent(); if (array != null) { var buffer = new UniformUnmanagedMemoryPool.FinalizableBuffer(this.pool, array, (int)totalLength); + if (options.Has(AllocationOptions.Clean)) + { + buffer.Clear(); + } + return MemoryGroup.CreateContiguous(buffer, options.Has(AllocationOptions.Clean)); } } diff --git a/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs b/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs index b5771f0c7..44ff438f3 100644 --- a/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs +++ b/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs @@ -30,8 +30,8 @@ namespace SixLabors.ImageSharp.Memory this.View = new MemoryGroupView(this); } - public Owned(UniformUnmanagedMemoryPool pool, UnmanagedMemoryHandle[] pooledArrays, int bufferLength, long totalLength, int sizeOfLastBuffer) - : this(CreateBuffers(pool, pooledArrays, bufferLength, sizeOfLastBuffer), bufferLength, totalLength, true) + public Owned(UniformUnmanagedMemoryPool pool, UnmanagedMemoryHandle[] pooledArrays, int bufferLength, long totalLength, int sizeOfLastBuffer, AllocationOptions options) + : this(CreateBuffers(pool, pooledArrays, bufferLength, sizeOfLastBuffer, options), bufferLength, totalLength, true) { this.pooledHandles = pooledArrays; this.unmanagedMemoryPool = pool; @@ -66,16 +66,29 @@ namespace SixLabors.ImageSharp.Memory UniformUnmanagedMemoryPool pool, UnmanagedMemoryHandle[] pooledBuffers, int bufferLength, - int sizeOfLastBuffer) + int sizeOfLastBuffer, + AllocationOptions options) { var result = new IMemoryOwner[pooledBuffers.Length]; for (int i = 0; i < pooledBuffers.Length - 1; i++) { pooledBuffers[i].AssignedToNewOwner(); - result[i] = new UniformUnmanagedMemoryPool.Buffer(pool, pooledBuffers[i], bufferLength); + var currentBuffer = new UniformUnmanagedMemoryPool.Buffer(pool, pooledBuffers[i], bufferLength); + if (options.Has(AllocationOptions.Clean)) + { + currentBuffer.Clear(); + } + + result[i] = currentBuffer; + } + + var lastBuffer = new UniformUnmanagedMemoryPool.Buffer(pool, pooledBuffers[pooledBuffers.Length - 1], sizeOfLastBuffer); + if (options.Has(AllocationOptions.Clean)) + { + lastBuffer.Clear(); } - result[result.Length - 1] = new UniformUnmanagedMemoryPool.Buffer(pool, pooledBuffers[pooledBuffers.Length - 1], sizeOfLastBuffer); + result[result.Length - 1] = lastBuffer; return result; }