public IAsyncResult BeginWrite(ReaderWriterGateCallback callback, Object state, AsyncCallback asyncCallback, Object asyncState) { AsyncResult<Object> ar = new AsyncResult<Object>(asyncCallback, asyncState); ReaderWriterGateReleaser releaser = new ReaderWriterGateReleaser(callback, this, false, state, ar); m_syncLock.Enter(true); switch (m_state) { case ReaderWriterGateStates.Free: // If Free "RFW -> OBW, invoke, return case ReaderWriterGateStates.ReservedForWriter: m_state = ReaderWriterGateStates.OwnedByWriter; ThreadPool.QueueUserWorkItem(releaser.Invoke); break; case ReaderWriterGateStates.OwnedByReaders: // If OBR | OBRAWP -> OBRAWP, queue, return case ReaderWriterGateStates.OwnedByReadersAndWriterPending: m_state = ReaderWriterGateStates.OwnedByReadersAndWriterPending; m_qWriteRequests.Enqueue(releaser); break; case ReaderWriterGateStates.OwnedByWriter: // If OBW, queue, return m_qWriteRequests.Enqueue(releaser); break; } m_syncLock.Leave(); return ar; }
public IAsyncResult BeginWrite(ReaderWriterGateCallback callback, Object state, AsyncCallback asyncCallback, Object asyncState) { AsyncResult <Object> ar = new AsyncResult <Object>(asyncCallback, asyncState); ReaderWriterGateReleaser releaser = new ReaderWriterGateReleaser(callback, this, false, state, ar); m_syncLock.Enter(true); switch (m_state) { case ReaderWriterGateStates.Free: // If Free "RFW -> OBW, invoke, return case ReaderWriterGateStates.ReservedForWriter: m_state = ReaderWriterGateStates.OwnedByWriter; ThreadPool.QueueUserWorkItem(releaser.Invoke); break; case ReaderWriterGateStates.OwnedByReaders: // If OBR | OBRAWP -> OBRAWP, queue, return case ReaderWriterGateStates.OwnedByReadersAndWriterPending: m_state = ReaderWriterGateStates.OwnedByReadersAndWriterPending; m_qWriteRequests.Enqueue(releaser); break; case ReaderWriterGateStates.OwnedByWriter: // If OBW, queue, return m_qWriteRequests.Enqueue(releaser); break; } m_syncLock.Leave(); return(ar); }
internal void Release(Boolean reader) { m_syncLock.Enter(true); // If writer or last reader, the lock is being freed Boolean freeing = reader ? (--m_numReaders == 0) : true; if (freeing) { // Wake up a writer, or all readers, or set to free if (m_qWriteRequests.Count > 0) { // A writer is queued, invoke it m_state = ReaderWriterGateStates.OwnedByWriter; ThreadPool.QueueUserWorkItem(m_qWriteRequests.Dequeue().Invoke); } else if (m_qReadRequests.Count > 0) { // Reader(s) are queued, invoke all of them m_state = ReaderWriterGateStates.OwnedByReaders; m_numReaders = m_qReadRequests.Count; while (m_qReadRequests.Count > 0) { ThreadPool.QueueUserWorkItem(m_qReadRequests.Dequeue().Invoke); } } else { // No writers or readers, free the gate m_state = ReaderWriterGateStates.Free; } } m_syncLock.Leave(); }
public ReaderWriterGate(Boolean blockReadersUntilFirstWriteCompletes) { m_state = blockReadersUntilFirstWriteCompletes ? ReaderWriterGateStates.ReservedForWriter : ReaderWriterGateStates.Free; }
internal void Release(Boolean reader) { m_syncLock.Enter(true); // If writer or last reader, the lock is being freed Boolean freeing = reader ? (--m_numReaders == 0) : true; if (freeing) { // Wake up a writer, or all readers, or set to free if (m_qWriteRequests.Count > 0) { // A writer is queued, invoke it m_state = ReaderWriterGateStates.OwnedByWriter; ThreadPool.QueueUserWorkItem(m_qWriteRequests.Dequeue().Invoke); } else if (m_qReadRequests.Count > 0) { // Reader(s) are queued, invoke all of them m_state = ReaderWriterGateStates.OwnedByReaders; m_numReaders = m_qReadRequests.Count; while (m_qReadRequests.Count > 0) { ThreadPool.QueueUserWorkItem(m_qReadRequests.Dequeue().Invoke); } } else { // No writers or readers, free the gate m_state = ReaderWriterGateStates.Free; } } m_syncLock.Leave(); }
public ReaderWriterGate(Boolean blockReadersUntilFirstWriteCompletes) { m_state = blockReadersUntilFirstWriteCompletes ? ReaderWriterGateStates.ReservedForWriter : ReaderWriterGateStates.Free; }