Browse Source

pass pinnable correctly

af/UniformUnmanagedMemoryPoolMemoryAllocator-02-MemoryGuards
Anton Firszov 5 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); this.BufferHandle.DangerousAddRef(ref unused);
void* pbData = Unsafe.Add<T>(this.Pointer, elementIndex); void* pbData = Unsafe.Add<T>(this.Pointer, elementIndex);
return new MemoryHandle(pbData); return new MemoryHandle(pbData, pinnable: this);
} }
/// <inheritdoc /> /// <inheritdoc />

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

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

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

@ -49,7 +49,7 @@ namespace SixLabors.ImageSharp.Memory
/// <inheritdoc/> /// <inheritdoc/>
public override MemoryHandle Pin(int elementIndex = 0) public override MemoryHandle Pin(int elementIndex = 0)
{ {
return new MemoryHandle(((T*)this.pointer) + elementIndex); return new MemoryHandle(((T*)this.pointer) + elementIndex, pinnable: this);
} }
/// <inheritdoc/> /// <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) public override unsafe MemoryHandle Pin(int elementIndex = 0)
{ {
void* ptr = (void*)this.bmpData.Scan0; void* ptr = (void*)this.bmpData.Scan0;
return new MemoryHandle(ptr); return new MemoryHandle(ptr, pinnable: this);
} }
public override void Unpin() 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); 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] [Fact]
public void MemoryAllocator_Create_WithoutSettings_AllocatesDiscontiguousMemory() 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(); void* ptr = (void*)this.pinHandle.AddrOfPinnedObject();
return new MemoryHandle(ptr, this.pinHandle); return new MemoryHandle(ptr, pinnable: this);
} }
public override void Unpin() public override void Unpin()
{ {
throw new NotImplementedException(); this.pinHandle.Free();
} }
/// <inheritdoc /> /// <inheritdoc />

Loading…
Cancel
Save