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;
      }
示例#2
0
        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);
        }
示例#3
0
        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();
 }
示例#6
0
 public ReaderWriterGate(Boolean blockReadersUntilFirstWriteCompletes)
 {
     m_state = blockReadersUntilFirstWriteCompletes ? ReaderWriterGateStates.ReservedForWriter : ReaderWriterGateStates.Free;
 }