예제 #1
0
 public NHContext(NHServerConnection c, Stream i, AcceptMethod a, ILogger l)
 {
     connection     = c;
     inputStream    = i;
     acceptor       = a;
     logger         = l;
     sequenceNumber = -1;
     request        = new NHServerRequest(this, logger);
     response       = new NHServerResponse(inputStream, this, logger);
 }
예제 #2
0
 public void ReportResponseCompleted(NHServerResponse caller)
 {
     lock (this)
     {
         Task <NHServerResponse> completedTask = responseWaiters.First();
         responseWaiters.RemoveFirst();
         // wake up whomever is blocked
         completedTask.Start();
         if (completedTask.Result != caller)
         {
             throw new ApplicationException("Mismatched responses");
         }
     }
 }
예제 #3
0
        public async Task WaitForResponseSlot(NHServerResponse caller)
        {
            Task <NHServerResponse> blockTask;

            lock (this)
            {
                if (faulted)
                {
                    throw new ApplicationException("Response stream faulted");
                }

                if (responseWaiters.Count == 0)
                {
                    // there's nobody to wait for
                    blockTask = null;
                }
                else
                {
                    // wait behind the current tail of the queue
                    blockTask = responseWaiters.Last();
                }

                responseWaiters.AddLast(new Task <NHServerResponse>(() => { return(caller); }));
            }

            if (blockTask != null)
            {
                await blockTask;
            }

            lock (this)
            {
                if (faulted)
                {
                    throw new ApplicationException("Response stream faulted");
                }
            }
        }