diff options
author | therzok <marius.ungureanu@xamarin.com> | 2019-07-21 21:47:31 +0300 |
---|---|---|
committer | therzok <marius.ungureanu@xamarin.com> | 2019-07-22 14:54:43 +0300 |
commit | c48256f8e332885c81b14134ef5778da2e333844 (patch) | |
tree | 9269c57fb226de76fe0e887b62df43565d3a1cb8 /main | |
parent | f3d2df0d337dbd080f37606a2900d496ab608e7d (diff) |
[Core] Add ReaderWriterLockSlim extensions for disposable locking
Diffstat (limited to 'main')
-rw-r--r-- | main/src/core/MonoDevelop.Core/CoreExtensions.ReaderWriterLockSlim.cs | 90 | ||||
-rw-r--r-- | main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj | 1 |
2 files changed, 91 insertions, 0 deletions
diff --git a/main/src/core/MonoDevelop.Core/CoreExtensions.ReaderWriterLockSlim.cs b/main/src/core/MonoDevelop.Core/CoreExtensions.ReaderWriterLockSlim.cs new file mode 100644 index 0000000000..b4805ff230 --- /dev/null +++ b/main/src/core/MonoDevelop.Core/CoreExtensions.ReaderWriterLockSlim.cs @@ -0,0 +1,90 @@ +// +// CoreExtensions.ReaderWriterLockSlim.cs +// +// Author: +// Marius Ungureanu <maungu@microsoft.com> +// +// Copyright (c) 2019 Microsoft Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using System.Threading; + +namespace System +{ + public static partial class CoreExtensions + { + internal static ReadLockExiter Read (this ReaderWriterLockSlim @lock) + => new ReadLockExiter (@lock); + + internal readonly struct ReadLockExiter : IDisposable + { + readonly ReaderWriterLockSlim _lock; + + internal ReadLockExiter (ReaderWriterLockSlim @lock) + { + _lock = @lock; + @lock.EnterReadLock (); + } + + public void Dispose () => _lock.ExitReadLock (); + } + + internal static UpgradeableReadLockExiter UpgradeableRead (this ReaderWriterLockSlim @lock) + => new UpgradeableReadLockExiter (@lock); + + internal readonly struct UpgradeableReadLockExiter : IDisposable + { + readonly ReaderWriterLockSlim _lock; + + internal UpgradeableReadLockExiter (ReaderWriterLockSlim @lock) + { + _lock = @lock; + @lock.EnterUpgradeableReadLock (); + } + + public void Dispose () + { + if (_lock.IsWriteLockHeld) { + _lock.ExitWriteLock (); + } + + _lock.ExitUpgradeableReadLock (); + } + + public void EnterWrite () => _lock.EnterWriteLock (); + } + + internal static WriteLockExiter Write (this ReaderWriterLockSlim @lock) + => new WriteLockExiter (@lock); + + internal readonly struct WriteLockExiter : IDisposable + { + readonly ReaderWriterLockSlim _lock; + + internal WriteLockExiter (ReaderWriterLockSlim @lock) + { + _lock = @lock; + @lock.EnterWriteLock (); + } + + public void Dispose () => _lock.ExitWriteLock (); + } + } +} diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj index e1ec35552d..63d61dadf9 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj @@ -741,6 +741,7 @@ <Compile Include="CoreExtensions.Memoize.cs" /> <Compile Include="CoreExtensions.EventHandlers.cs" /> <Compile Include="CoreExtensions.Array.cs" /> + <Compile Include="CoreExtensions.ReaderWriterLockSlim.cs" /> </ItemGroup> <ItemGroup> <None Include="BuildVariables.cs.in" /> |