Browse Source

fix memory sentinel initialization

af/UniformUnmanagedMemoryPoolMemoryAllocator-02-MemoryGuards
Anton Firszov 5 years ago
parent
commit
c6428aba6d
  1. 3
      src/ImageSharp/Memory/Allocators/Internals/UnmanagedBuffer{T}.cs
  2. 9
      src/ImageSharp/Memory/Allocators/Internals/UnmanagedMemoryHandle.cs
  3. 2
      src/ImageSharp/Memory/Buffer2D{T}.cs
  4. 11
      src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs
  5. 4
      src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.cs

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

@ -32,6 +32,7 @@ namespace SixLabors.ImageSharp.Memory.Internals
{
this.lengthInElements = lengthInElements;
this.BufferHandle = bufferHandle;
this.BufferHandle.InitMemorySentinel();
}
public UnmanagedMemoryHandle BufferHandle { get; protected set; }
@ -71,6 +72,6 @@ namespace SixLabors.ImageSharp.Memory.Internals
}
[Conditional("MEMORY_SENTINEL")]
protected void VerifyMemorySentinel() => this.BufferHandle.VerifyMemorySentinel(this.lengthInElements * Unsafe.SizeOf<T>());
internal void VerifyMemorySentinel() => this.BufferHandle.VerifyMemorySentinel(this.lengthInElements * Unsafe.SizeOf<T>());
}
}

9
src/ImageSharp/Memory/Allocators/Internals/UnmanagedMemoryHandle.cs

@ -85,15 +85,12 @@ namespace SixLabors.ImageSharp.Memory.Internals
internal static UnmanagedMemoryHandle Allocate(int lengthInBytes)
{
IntPtr handle = AllocateHandle(lengthInBytes + MemorySentinelPadding);
#if MEMORY_SENTINEL
unsafe
{
new Span<byte>((void*)handle, lengthInBytes + MemorySentinelPadding).Fill(42);
}
#endif
return new UnmanagedMemoryHandle(handle, lengthInBytes);
}
[Conditional("MEMORY_SENTINEL")]
internal unsafe void InitMemorySentinel() => new Span<byte>((void*)this.handle, this.lengthInBytes + MemorySentinelPadding).Fill(42);
[Conditional("MEMORY_SENTINEL")]
internal unsafe void VerifyMemorySentinel(int actualLengthInBytes)
{

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

@ -164,6 +164,8 @@ namespace SixLabors.ImageSharp.Memory
[MethodImpl(InliningOptions.ShortMethod)]
internal Memory<T> DangerousGetSingleMemory() => this.FastMemoryGroup.Single();
internal void VerifyMemorySentinel() => this.FastMemoryGroup.VerifyMemorySentinel();
/// <summary>
/// Swaps the contents of 'destination' with 'source' if the buffers are owned (1),
/// copies the contents of 'source' to 'destination' otherwise (2). Buffers should be of same size in case 2!

11
src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs

@ -111,6 +111,17 @@ namespace SixLabors.ImageSharp.Memory
}
}
public override void VerifyMemorySentinel()
{
foreach (IMemoryOwner<T> memoryOwner in this.memoryOwners)
{
if (memoryOwner is UnmanagedBuffer<T> unmanagedBuffer)
{
unmanagedBuffer.VerifyMemorySentinel();
}
}
}
/// <inheritdoc/>
IEnumerator<Memory<T>> IEnumerable<Memory<T>>.GetEnumerator()
{

4
src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.cs

@ -278,5 +278,9 @@ namespace SixLabors.ImageSharp.Memory
public virtual void DecreaseRefCounts()
{
}
public virtual void VerifyMemorySentinel()
{
}
}
}

Loading…
Cancel
Save