Browse Source

fix ManagedBufferBase pinning behavior

pull/1756/head
Anton Firszov 5 years ago
parent
commit
f4a3a0e76b
  1. 4
      src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs
  2. 17
      tests/ImageSharp.Tests/Memory/Allocators/ArrayPoolMemoryAllocatorTests.cs
  3. 20
      tests/ImageSharp.Tests/Memory/Allocators/SimpleGcMemoryAllocatorTests.cs

4
src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs

@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.Memory.Internals
}
void* ptr = (void*)this.pinHandle.AddrOfPinnedObject();
return new MemoryHandle(ptr, this.pinHandle);
return new MemoryHandle(ptr, this.pinHandle, this);
}
/// <inheritdoc />
@ -42,4 +42,4 @@ namespace SixLabors.ImageSharp.Memory.Internals
/// <returns>The pinnable <see cref="object"/>.</returns>
protected abstract object GetPinnableObject();
}
}
}

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

@ -114,6 +114,23 @@ namespace SixLabors.ImageSharp.Tests.Memory.Allocators
}
}
[Fact]
public unsafe void Allocate_MemoryIsPinnableMultipleTimes()
{
ArrayPoolMemoryAllocator allocator = this.LocalFixture.MemoryAllocator;
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);
}
}
[Theory]
[InlineData(false)]
[InlineData(true)]

20
tests/ImageSharp.Tests/Memory/Allocators/SimpleGcMemoryAllocatorTests.cs

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
using System.Buffers;
using System.Runtime.InteropServices;
using SixLabors.ImageSharp.Memory;
using Xunit;
@ -36,9 +37,26 @@ namespace SixLabors.ImageSharp.Tests.Memory.Allocators
Assert.Equal("length", ex.ParamName);
}
[Fact]
public unsafe void Allocate_MemoryIsPinnableMultipleTimes()
{
SimpleGcMemoryAllocator allocator = this.MemoryAllocator;
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);
}
}
[StructLayout(LayoutKind.Explicit, Size = 512)]
private struct BigStruct
{
}
}
}
}

Loading…
Cancel
Save