using System; using System.Collections.Concurrent; using System.Threading; namespace WireMock.Util { /// /// http://johnculviner.com/achieving-named-lock-locker-functionality-in-c-4-0/ /// internal class NamedReaderWriterLocker { private readonly ConcurrentDictionary _lockDict = new ConcurrentDictionary(); public ReaderWriterLockSlim GetLock(string name) { return _lockDict.GetOrAdd(name, s => new ReaderWriterLockSlim()); } public TResult RunWithReadLock(string name, Func body) { var rwLock = GetLock(name); try { rwLock.EnterReadLock(); return body(); } finally { rwLock.ExitReadLock(); } } public void RunWithReadLock(string name, Action body) { var rwLock = GetLock(name); try { rwLock.EnterReadLock(); body(); } finally { rwLock.ExitReadLock(); } } public TResult RunWithWriteLock(string name, Func body) { var rwLock = GetLock(name); try { rwLock.EnterWriteLock(); return body(); } finally { rwLock.ExitWriteLock(); } } public void RunWithWriteLock(string name, Action body) { var rwLock = GetLock(name); try { rwLock.EnterWriteLock(); body(); } finally { rwLock.ExitWriteLock(); } } public void RemoveLock(string name) { _lockDict.TryRemove(name, out _); } } }