Browse Source

pass pinnable correctly

af/UniformUnmanagedMemoryPoolMemoryAllocator-02-MemoryGuards
Anton Firszov 4 years ago
parent
commit
ce1ac2cd70
  1. 2
      src/ImageSharp/Memory/Allocators/Internals/UniformUnmanagedMemoryPool.Buffer{T}.cs
  2. 2
      src/ImageSharp/Memory/Allocators/Internals/UnmanagedBuffer{T}.cs
  3. 2
      src/ImageSharp/Memory/UnmanagedMemoryManager{T}.cs
  4. 2
      tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs
  5. 17
      tests/ImageSharp.Tests/Memory/Allocators/UniformUnmanagedPoolMemoryAllocatorTests.cs
  6. 4
      tests/ImageSharp.Tests/TestUtilities/TestMemoryAllocator.cs

2
src/ImageSharp/Memory/Allocators/Internals/UniformUnmanagedMemoryPool.Buffer{T}.cs

@ -36,7 +36,7 @@ namespace SixLabors.ImageSharp.Memory.Internals
this.BufferHandle.DangerousAddRef(ref unused);
void* pbData = Unsafe.Add<T>(this.Pointer, elementIndex);
return new MemoryHandle(pbData);
return new MemoryHandle(pbData, pinnable: this);
}
/// <inheritdoc />

2
src/ImageSharp/Memory/Allocators/Internals/UnmanagedBuffer{T}.cs

@ -42,7 +42,7 @@ namespace SixLabors.ImageSharp.Memory.Internals
this.bufferHandle.DangerousAddRef(ref unused);
void* pbData = Unsafe.Add<T>(this.Pointer, elementIndex);
return new MemoryHandle(pbData);
return new MemoryHandle(pbData, pinnable: this);
}
/// <inheritdoc />

2
src/ImageSharp/Memory/UnmanagedMemoryManager{T}.cs

@ -49,7 +49,7 @@ namespace SixLabors.ImageSharp.Memory
/// <inheritdoc/>
public override MemoryHandle Pin(int elementIndex = 0)
{
return new MemoryHandle(((T*)this.pointer) + elementIndex);
return new MemoryHandle(((T*)this.pointer) + elementIndex, pinnable: this);
}
/// <inheritdoc/>

2
tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs

@ -71,7 +71,7 @@ namespace SixLabors.ImageSharp.Tests
public override unsafe MemoryHandle Pin(int elementIndex = 0)
{
void* ptr = (void*)this.bmpData.Scan0;
return new MemoryHandle(ptr);
return new MemoryHandle(ptr, pinnable: this);
}
public override void Unpin()

17
tests/ImageSharp.Tests/Memory/Allocators/UniformUnmanagedPoolMemoryAllocatorTests.cs

@ -130,6 +130,23 @@ namespace SixLabors.ImageSharp.Tests.Memory.Allocators
Assert.Equal(1, g.Count);
}
[Fact]
public unsafe void Allocate_MemoryIsPinnableMultipleTimes()
{
var allocator = new UniformUnmanagedMemoryPoolMemoryAllocator(null);
using IMemoryOwner<byte> memoryOwner = allocator.Allocate<byte>(100);
using (MemoryHandle pin = memoryOwner.Memory.Pin())
{
Assert.NotEqual(IntPtr.Zero, (IntPtr)pin.Pointer);
}
using (MemoryHandle pin = memoryOwner.Memory.Pin())
{
Assert.NotEqual(IntPtr.Zero, (IntPtr)pin.Pointer);
}
}
[Fact]
public void MemoryAllocator_Create_WithoutSettings_AllocatesDiscontiguousMemory()
{

4
tests/ImageSharp.Tests/TestUtilities/TestMemoryAllocator.cs

@ -146,12 +146,12 @@ namespace SixLabors.ImageSharp.Tests.Memory
}
void* ptr = (void*)this.pinHandle.AddrOfPinnedObject();
return new MemoryHandle(ptr, this.pinHandle);
return new MemoryHandle(ptr, pinnable: this);
}
public override void Unpin()
{
throw new NotImplementedException();
this.pinHandle.Free();
}
/// <inheritdoc />

Loading…
Cancel
Save