|
|
|
@ -1,3 +1,6 @@ |
|
|
|
// Copyright (c) The Avalonia Project. All rights reserved.
|
|
|
|
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
|
|
|
|
|
|
|
using System; |
|
|
|
using System.Threading; |
|
|
|
|
|
|
|
@ -6,12 +9,6 @@ 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
|
|
|
|
@ -20,7 +17,7 @@ namespace Avalonia.Rendering |
|
|
|
public IDisposable TryLock() |
|
|
|
{ |
|
|
|
if (Monitor.TryEnter(_lock)) |
|
|
|
return _lockDisposable; |
|
|
|
return new UnlockDisposable(_lock); |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@ -30,21 +27,26 @@ namespace Avalonia.Rendering |
|
|
|
public IDisposable Lock() |
|
|
|
{ |
|
|
|
Monitor.Enter(_lock); |
|
|
|
return _lockDisposable; |
|
|
|
return new UnlockDisposable(_lock); |
|
|
|
} |
|
|
|
|
|
|
|
private class LockDisposable : IDisposable |
|
|
|
private class UnlockDisposable : IDisposable |
|
|
|
{ |
|
|
|
private readonly object _lock; |
|
|
|
private object _lock; |
|
|
|
|
|
|
|
public LockDisposable(object @lock) |
|
|
|
public UnlockDisposable(object @lock) |
|
|
|
{ |
|
|
|
_lock = @lock; |
|
|
|
} |
|
|
|
|
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
Monitor.Exit(_lock); |
|
|
|
object @lock = Interlocked.Exchange(ref _lock, null); |
|
|
|
|
|
|
|
if (@lock != null) |
|
|
|
{ |
|
|
|
Monitor.Exit(@lock); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|