public bool TryEnterReadLock(int timeOut) { bool result = false; SPW sw = new SPW(); int tid = ReadLockIndex; // Wait until there are no writers. DateTime endTime = DateTime.Now.AddMilliseconds(timeOut); while (DateTime.Now < endTime) { while (m_writer == 1) { sw.SpinOnce(); } // Try to take the read lock. Interlocked.Increment(ref m_readers[tid].m_taken); if (m_writer == 0) { // Success, no writer, proceed. result = true; break; } // Back off, to let the writer go through. Interlocked.Decrement(ref m_readers[tid].m_taken); } return(result); }
public bool TryEnterWriteLock(int timeOut) { bool result = false; SPW sw = new SPW(); DateTime endTime = DateTime.Now.AddMilliseconds(timeOut); while (DateTime.Now < endTime) { if (m_writer == 0 && Interlocked.Exchange(ref m_writer, 1) == 0) { // We now hold the write lock, and prevent new readers. // But we must ensure no readers exist before proceeding. for (int i = 0; i < m_readers.Length; i++) { while (m_readers[i].m_taken != 0) { sw.SpinOnce(); } } result = true; break; } // We failed to take the write lock; wait a bit and retry. sw.SpinOnce(); } return(result); }
public void EnterReadLock() { SPW sw = new SPW(); int tid = ReadLockIndex; // Wait until there are no writers. while (true) { while (m_writer == 1) sw.SpinOnce(); // Try to take the read lock. Interlocked.Increment(ref m_readers[tid].m_taken); if (m_writer == 0) { // Success, no writer, proceed. break; } // Back off, to let the writer go through. Interlocked.Decrement(ref m_readers[tid].m_taken); } }
public bool TryEnterReadLock(int timeOut) { bool result = false; SPW sw = new SPW(); int tid = ReadLockIndex; // Wait until there are no writers. DateTime endTime = DateTime.Now.AddMilliseconds(timeOut); while (DateTime.Now < endTime) { while (m_writer == 1) sw.SpinOnce(); // Try to take the read lock. Interlocked.Increment(ref m_readers[tid].m_taken); if (m_writer == 0) { // Success, no writer, proceed. result = true; break; } // Back off, to let the writer go through. Interlocked.Decrement(ref m_readers[tid].m_taken); } return result; }
public void EnterReadLock() { SPW sw = new SPW(); int tid = ReadLockIndex; // Wait until there are no writers. while (true) { while (m_writer == 1) { sw.SpinOnce(); } // Try to take the read lock. Interlocked.Increment(ref m_readers[tid].m_taken); if (m_writer == 0) { // Success, no writer, proceed. break; } // Back off, to let the writer go through. Interlocked.Decrement(ref m_readers[tid].m_taken); } }
public void EnterWriteLock() { SPW sw = new SPW(); while (true) { if (m_writer == 0 && Interlocked.Exchange(ref m_writer, 1) == 0) { // We now hold the write lock, and prevent new readers. // But we must ensure no readers exist before proceeding. for (int i = 0; i < m_readers.Length; i++) { while (m_readers[i].m_taken != 0) { sw.SpinOnce(); } } break; } // We failed to take the write lock; wait a bit and retry. sw.SpinOnce(); } }
public void EnterWriteLock() { SPW sw = new SPW(); while (true) { if (m_writer == 0 && Interlocked.Exchange(ref m_writer, 1) == 0) { // We now hold the write lock, and prevent new readers. // But we must ensure no readers exist before proceeding. for (int i = 0; i < m_readers.Length; i++) while (m_readers[i].m_taken != 0) sw.SpinOnce(); break; } // We failed to take the write lock; wait a bit and retry. sw.SpinOnce(); } }
public bool TryEnterWriteLock(int timeOut) { bool result = false; SPW sw = new SPW(); DateTime endTime = DateTime.Now.AddMilliseconds(timeOut); while (DateTime.Now < endTime) { if (m_writer == 0 && Interlocked.Exchange(ref m_writer, 1) == 0) { // We now hold the write lock, and prevent new readers. // But we must ensure no readers exist before proceeding. for (int i = 0; i < m_readers.Length; i++) while (m_readers[i].m_taken != 0) sw.SpinOnce(); result = true; break; } // We failed to take the write lock; wait a bit and retry. sw.SpinOnce(); } return result; }