diff --git a/src/ImageSharp/Memory/Allocators/Internals/UnmanagedBuffer{T}.cs b/src/ImageSharp/Memory/Allocators/Internals/UnmanagedBuffer{T}.cs index 6c76a18d8a..95a739b3fc 100644 --- a/src/ImageSharp/Memory/Allocators/Internals/UnmanagedBuffer{T}.cs +++ b/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()); + internal void VerifyMemorySentinel() => this.BufferHandle.VerifyMemorySentinel(this.lengthInElements * Unsafe.SizeOf()); } } diff --git a/src/ImageSharp/Memory/Allocators/Internals/UnmanagedMemoryHandle.cs b/src/ImageSharp/Memory/Allocators/Internals/UnmanagedMemoryHandle.cs index 2cb6510383..013189683f 100644 --- a/src/ImageSharp/Memory/Allocators/Internals/UnmanagedMemoryHandle.cs +++ b/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((void*)handle, lengthInBytes + MemorySentinelPadding).Fill(42); - } -#endif return new UnmanagedMemoryHandle(handle, lengthInBytes); } + [Conditional("MEMORY_SENTINEL")] + internal unsafe void InitMemorySentinel() => new Span((void*)this.handle, this.lengthInBytes + MemorySentinelPadding).Fill(42); + [Conditional("MEMORY_SENTINEL")] internal unsafe void VerifyMemorySentinel(int actualLengthInBytes) { diff --git a/src/ImageSharp/Memory/Buffer2D{T}.cs b/src/ImageSharp/Memory/Buffer2D{T}.cs index ba39a924ea..3eec7d21d9 100644 --- a/src/ImageSharp/Memory/Buffer2D{T}.cs +++ b/src/ImageSharp/Memory/Buffer2D{T}.cs @@ -164,6 +164,8 @@ namespace SixLabors.ImageSharp.Memory [MethodImpl(InliningOptions.ShortMethod)] internal Memory DangerousGetSingleMemory() => this.FastMemoryGroup.Single(); + internal void VerifyMemorySentinel() => this.FastMemoryGroup.VerifyMemorySentinel(); + /// /// 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! diff --git a/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs b/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs index b5771f0c74..c02119a38c 100644 --- a/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs +++ b/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.Owned.cs @@ -111,6 +111,17 @@ namespace SixLabors.ImageSharp.Memory } } + public override void VerifyMemorySentinel() + { + foreach (IMemoryOwner memoryOwner in this.memoryOwners) + { + if (memoryOwner is UnmanagedBuffer unmanagedBuffer) + { + unmanagedBuffer.VerifyMemorySentinel(); + } + } + } + /// IEnumerator> IEnumerable>.GetEnumerator() { diff --git a/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.cs b/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.cs index f517482d7b..f3b48b2eac 100644 --- a/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.cs +++ b/src/ImageSharp/Memory/DiscontiguousBuffers/MemoryGroup{T}.cs @@ -278,5 +278,9 @@ namespace SixLabors.ImageSharp.Memory public virtual void DecreaseRefCounts() { } + + public virtual void VerifyMemorySentinel() + { + } } }