Browse Source

Avoid per-frame allocations in renderer lock.

Dariusz Komosinski 6 years ago
parent
commit
a9da85e4ae
1 changed files with 24 additions and 4 deletions
  1. 24 4
      src/Avalonia.Visuals/Rendering/ManagedDeferredRendererLock.cs

+ 24 - 4
src/Avalonia.Visuals/Rendering/ManagedDeferredRendererLock.cs

@@ -1,5 +1,4 @@
 using System;
-using System.Reactive.Disposables;
 using System.Threading;
 
 namespace Avalonia.Rendering
@@ -7,7 +6,13 @@ namespace Avalonia.Rendering
     public class ManagedDeferredRendererLock : IDeferredRendererLock
     {
         private readonly object _lock = new object();
-        
+        private readonly LockDisposable _lockDisposable;
+
+        public ManagedDeferredRendererLock()
+        {
+            _lockDisposable = new LockDisposable(_lock);
+        }
+
         /// <summary>
         /// Tries to lock the target surface or window
         /// </summary>
@@ -15,7 +20,7 @@ namespace Avalonia.Rendering
         public IDisposable TryLock()
         {
             if (Monitor.TryEnter(_lock))
-                return Disposable.Create(() => Monitor.Exit(_lock));
+                return _lockDisposable;
             return null;
         }
 
@@ -25,7 +30,22 @@ namespace Avalonia.Rendering
         public IDisposable Lock()
         {
             Monitor.Enter(_lock);
-            return Disposable.Create(() => Monitor.Exit(_lock));
+            return _lockDisposable;
+        }
+
+        private class LockDisposable : IDisposable
+        {
+            private readonly object _lock;
+
+            public LockDisposable(object @lock)
+            {
+                _lock = @lock;
+            }
+
+            public void Dispose()
+            {
+                Monitor.Exit(_lock);
+            }
         }
     }
 }