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