You've already forked linux-packaging-mono
Imported Upstream version 4.0.0~alpha1
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
This commit is contained in:
94
external/referencesource/System.Web/Util/ReadWriteObjectLock.cs
vendored
Normal file
94
external/referencesource/System.Web/Util/ReadWriteObjectLock.cs
vendored
Normal file
@ -0,0 +1,94 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <copyright file="ReadWriteObjectLock.cs" company="Microsoft">
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// </copyright>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
* ReadWriteObjectLock
|
||||
*
|
||||
* Copyright (c) 1998-1999, Microsoft Corporation
|
||||
*
|
||||
*/
|
||||
|
||||
namespace System.Web.Util {
|
||||
|
||||
using System.Runtime.Serialization.Formatters;
|
||||
using System.Threading;
|
||||
|
||||
class ReadWriteObjectLock {
|
||||
// Assumption:
|
||||
// -1 = a writer has the lock
|
||||
// 0 = no one has the lock
|
||||
// >0 = number of readers using the lock
|
||||
private int _lock;
|
||||
|
||||
internal ReadWriteObjectLock() {
|
||||
}
|
||||
|
||||
internal virtual void AcquireRead() {
|
||||
lock(this) {
|
||||
while (_lock == -1) {
|
||||
try {
|
||||
Monitor.Wait(this);
|
||||
}
|
||||
catch (ThreadInterruptedException) {
|
||||
// Just keep looping
|
||||
}
|
||||
}
|
||||
|
||||
_lock++;
|
||||
}
|
||||
}
|
||||
|
||||
internal virtual void ReleaseRead() {
|
||||
lock(this) {
|
||||
Debug.Assert(_lock > 0);
|
||||
|
||||
_lock--;
|
||||
if (_lock == 0) {
|
||||
Monitor.PulseAll(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal virtual void AcquireWrite() {
|
||||
lock(this) {
|
||||
while (_lock != 0) {
|
||||
try {
|
||||
Monitor.Wait(this);
|
||||
}
|
||||
catch (ThreadInterruptedException) {
|
||||
// Just keep looping
|
||||
}
|
||||
}
|
||||
|
||||
_lock = -1;
|
||||
}
|
||||
}
|
||||
|
||||
internal virtual void ReleaseWrite() {
|
||||
lock(this) {
|
||||
Debug.Assert(_lock == -1);
|
||||
|
||||
_lock = 0;
|
||||
Monitor.PulseAll(this);
|
||||
}
|
||||
}
|
||||
/*
|
||||
internal virtual void AssertReadLock() {
|
||||
#if DBG
|
||||
Debug.Assert(_lock > 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
internal virtual void AssertWriteLock() {
|
||||
#if DBG
|
||||
Debug.Assert(_lock == -1);
|
||||
#endif
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user