obfuz/Plugins/dnlib/Threading/Lock.cs

92 lines
1.9 KiB
C#
Raw Normal View History

// dnlib: See LICENSE.txt for more info
using System;
using System.Runtime.Serialization;
using System.Threading;
namespace dnlib.Threading {
#if THREAD_SAFE
[Serializable]
class LockException : Exception {
public LockException() {
}
public LockException(string msg)
: base(msg) {
}
protected LockException(SerializationInfo info, StreamingContext context)
: base(info, context) {
}
}
/// <summary>
/// Simple class using Monitor.Enter() and Monitor.Exit()
/// and just like <c>ReaderWriterLockSlim</c> it prevents recursive locks. It doesn't support
/// multiple readers. A reader lock is the same as a writer lock.
/// </summary>
class Lock {
readonly object lockObj;
int recurseCount;
/// <summary>
/// Creates a new instance of this class
/// </summary>
/// <returns></returns>
public static Lock Create() => new Lock();
/// <summary>
/// Constructor
/// </summary>
Lock() {
lockObj = new object();
recurseCount = 0;
}
/// <summary>
/// Enter read mode
/// </summary>
public void EnterReadLock() {
Monitor.Enter(lockObj);
if (recurseCount != 0) {
Monitor.Exit(lockObj);
throw new LockException("Recursive locks aren't supported");
}
recurseCount++;
}
/// <summary>
/// Exit read mode
/// </summary>
public void ExitReadLock() {
if (recurseCount <= 0)
throw new LockException("Too many exit lock method calls");
recurseCount--;
Monitor.Exit(lockObj);
}
/// <summary>
/// Enter write mode
/// </summary>
public void EnterWriteLock() {
Monitor.Enter(lockObj);
if (recurseCount != 0) {
Monitor.Exit(lockObj);
throw new LockException("Recursive locks aren't supported");
}
recurseCount--;
}
/// <summary>
/// Exit write mode
/// </summary>
public void ExitWriteLock() {
if (recurseCount >= 0)
throw new LockException("Too many exit lock method calls");
recurseCount++;
Monitor.Exit(lockObj);
}
}
#endif
}