Browse Source

added comments for the WeakReference stuff

pull/475/head
Anton Firszov 8 years ago
parent
commit
4d915b6e31
  1. 4
      src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs
  2. 13
      tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs
  3. 2
      tests/ImageSharp.Tests/Memory/BufferAreaTests.cs

4
src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs

@ -25,6 +25,10 @@ namespace SixLabors.ImageSharp.Memory
/// <summary> /// <summary>
/// A weak reference to the source pool. /// A weak reference to the source pool.
/// </summary> /// </summary>
/// <remarks>
/// By using a weak reference here, we are making sure that array pools and their retained arrays are always GC-ed
/// after a call to <see cref="ArrayPoolMemoryManager.ReleaseRetainedResources"/>, regardless of having buffer instances still being in use.
/// </remarks>
private WeakReference<ArrayPool<byte>> sourcePoolReference; private WeakReference<ArrayPool<byte>> sourcePoolReference;
public Buffer(byte[] data, int length, ArrayPool<byte> sourcePool) public Buffer(byte[] data, int length, ArrayPool<byte> sourcePool)

13
tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs

@ -127,14 +127,21 @@ namespace SixLabors.ImageSharp.Tests.Memory
} }
} }
[Fact] [Theory]
public void ReleaseRetainedResources_ReplacesInnerArrayPool() [InlineData(false)]
[InlineData(true)]
public void ReleaseRetainedResources_ReplacesInnerArrayPool(bool keepBufferAlive)
{ {
IBuffer<int> buffer = this.MemoryManager.Allocate<int>(32); IBuffer<int> buffer = this.MemoryManager.Allocate<int>(32);
ref int ptrToPrev0 = ref buffer.Span.DangerousGetPinnableReference(); ref int ptrToPrev0 = ref buffer.Span.DangerousGetPinnableReference();
buffer.Dispose();
if (!keepBufferAlive)
{
buffer.Dispose();
}
this.MemoryManager.ReleaseRetainedResources(); this.MemoryManager.ReleaseRetainedResources();
buffer = this.MemoryManager.Allocate<int>(32); buffer = this.MemoryManager.Allocate<int>(32);
Assert.False(Unsafe.AreSame(ref ptrToPrev0, ref buffer.DangerousGetPinnableReference())); Assert.False(Unsafe.AreSame(ref ptrToPrev0, ref buffer.DangerousGetPinnableReference()));

2
tests/ImageSharp.Tests/Memory/BufferAreaTests.cs

@ -104,7 +104,7 @@ namespace SixLabors.ImageSharp.Tests.Memory
{ {
BufferArea<int> area0 = buffer.GetArea(6, 8, 10, 10); BufferArea<int> area0 = buffer.GetArea(6, 8, 10, 10);
ref int r = ref area0.GetReferenceToOrigo(); ref int r = ref area0.GetReferenceToOrigin();
int expected = buffer[6, 8]; int expected = buffer[6, 8];
Assert.Equal(expected, r); Assert.Equal(expected, r);

Loading…
Cancel
Save