From 976b2a89789449cc82791934cab7e673b36dff10 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Tue, 1 Feb 2022 22:48:49 +0100 Subject: [PATCH] review suggestions --- .../Diagnostics/MemoryDiagnostics.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ImageSharp/Diagnostics/MemoryDiagnostics.cs b/src/ImageSharp/Diagnostics/MemoryDiagnostics.cs index 6bd81d7e5f..1cd72152b4 100644 --- a/src/ImageSharp/Diagnostics/MemoryDiagnostics.cs +++ b/src/ImageSharp/Diagnostics/MemoryDiagnostics.cs @@ -20,6 +20,7 @@ namespace SixLabors.ImageSharp.Diagnostics private static UndisposedMemoryResourceDelegate undisposedMemoryResource; private static int undisposedMemoryResourceSubscriptionCounter; + private static readonly object SyncRoot = new(); /// /// Fires when an ImageSharp object's undisposed memory resource leaks to the finalizer. @@ -30,14 +31,20 @@ namespace SixLabors.ImageSharp.Diagnostics { add { - Interlocked.Increment(ref undisposedMemoryResourceSubscriptionCounter); - undisposedMemoryResource += value; + lock (SyncRoot) + { + undisposedMemoryResourceSubscriptionCounter++; + undisposedMemoryResource += value; + } } remove { - undisposedMemoryResource -= value; - Interlocked.Decrement(ref undisposedMemoryResourceSubscriptionCounter); + lock (SyncRoot) + { + undisposedMemoryResource -= value; + undisposedMemoryResourceSubscriptionCounter--; + } } } @@ -56,6 +63,11 @@ namespace SixLabors.ImageSharp.Diagnostics internal static void RaiseUndisposedMemoryResource(string allocationStackTrace) { + if (undisposedMemoryResource is null) + { + return; + } + // Schedule on the ThreadPool, to avoid user callback messing up the finalizer thread. ThreadPool.QueueUserWorkItem(_ => undisposedMemoryResource?.Invoke(allocationStackTrace)); }