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); }
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"); } } }
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"); } } }