Browse Source

review suggestions

pull/1969/head
Anton Firszov 5 years ago
parent
commit
976b2a8978
  1. 20
      src/ImageSharp/Diagnostics/MemoryDiagnostics.cs

20
src/ImageSharp/Diagnostics/MemoryDiagnostics.cs

@ -20,6 +20,7 @@ namespace SixLabors.ImageSharp.Diagnostics
private static UndisposedMemoryResourceDelegate undisposedMemoryResource; private static UndisposedMemoryResourceDelegate undisposedMemoryResource;
private static int undisposedMemoryResourceSubscriptionCounter; private static int undisposedMemoryResourceSubscriptionCounter;
private static readonly object SyncRoot = new();
/// <summary> /// <summary>
/// Fires when an ImageSharp object's undisposed memory resource leaks to the finalizer. /// Fires when an ImageSharp object's undisposed memory resource leaks to the finalizer.
@ -30,14 +31,20 @@ namespace SixLabors.ImageSharp.Diagnostics
{ {
add add
{ {
Interlocked.Increment(ref undisposedMemoryResourceSubscriptionCounter); lock (SyncRoot)
undisposedMemoryResource += value; {
undisposedMemoryResourceSubscriptionCounter++;
undisposedMemoryResource += value;
}
} }
remove remove
{ {
undisposedMemoryResource -= value; lock (SyncRoot)
Interlocked.Decrement(ref undisposedMemoryResourceSubscriptionCounter); {
undisposedMemoryResource -= value;
undisposedMemoryResourceSubscriptionCounter--;
}
} }
} }
@ -56,6 +63,11 @@ namespace SixLabors.ImageSharp.Diagnostics
internal static void RaiseUndisposedMemoryResource(string allocationStackTrace) internal static void RaiseUndisposedMemoryResource(string allocationStackTrace)
{ {
if (undisposedMemoryResource is null)
{
return;
}
// Schedule on the ThreadPool, to avoid user callback messing up the finalizer thread. // Schedule on the ThreadPool, to avoid user callback messing up the finalizer thread.
ThreadPool.QueueUserWorkItem(_ => undisposedMemoryResource?.Invoke(allocationStackTrace)); ThreadPool.QueueUserWorkItem(_ => undisposedMemoryResource?.Invoke(allocationStackTrace));
} }

Loading…
Cancel
Save