Exemplo n.º 1
0
 // auxiliary method: grant access to the first waiting writer
 private void GrantAccessToAWaitingWriter()
 {
     if (writeReqQueue.Count > 0)
     {
         LinkedListNode <bool> reqNode = writeReqQueue.First;
         reqNode.Value = true;              // set request.done to true
         state         = -1;                // exclusive lock was taken
         writeReqQueue.RemoveFirst();
         MonitorEx.Pulse(monitor, reqNode); // notify the waiting writer
     }
 }
Exemplo n.º 2
0
 // send a message to the queue
 public void Send(T sentMsg)
 {
     lock (monitor) {
         UpdateStateOnSend(sentMsg);
         if (reqQueue.Count > 0)
         {
             Request request = reqQueue.First.Value;
             reqQueue.RemovestFirst();
             request.receivedMsg = ReceiveSideEffect();
             request.done        = true;
             // notify waiting thread on its private condition variable
             MonitorEx.Pulse(monitor, request);
         }
     }
 }
Exemplo n.º 3
0
 // perform the possible pending acquires
 private void PerformPossibleAcquires()
 {
     while (reqQueue.Count > 0)
     {
         Request request = reqQueue.First.Value;
         if (!CanAcquire(request.acquires))
         {
             break;
         }
         // remove request from queue and satisfy it
         reqQueue.RemoveFirst();
         AcquireSideEffect(request.acquires);
         request.done = true;
         MonitorEx.Pulse(monitor, request);      // *specific thread notification*
     }
 }
Exemplo n.º 4
0
 // send a message to the queue (optimized)
 public void SendOptimized(T sentMsg)
 {
     lock (monitor) {
         if (reqQueue.Count > 0)
         {
             // deliver the message directly to a blocked thread
             Request request = reqQueue.First.Value;
             reqQueue.Remove(request);
             request.receivedMsg = sentMsg;
             request.done        = true;
             // notify waiting thread on its private conditions variable
             MonitorEx.Pulse(monitor, request);
         }
         else
         {
             // no receiving thread, so the message is left in the respective queue
             UpdateStateDueToSend(sentMsg);
         }
     }
 }