Browse Source

Avoid per-frame allocations in renderer lock.

pull/2918/head
Dariusz Komosinski 7 years ago
parent
commit
a9da85e4ae
  1. 28
      src/Avalonia.Visuals/Rendering/ManagedDeferredRendererLock.cs

28
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);
}
}
}
}

Loading…
Cancel
Save