private void sendOutQueue(clientSiteState state, bool isManager) { try { sendOutQueueCore(state, isManager); } catch (Exception error) { Binding.WriteLog(LogSrc.Server, Log.MessageType.Error, "sendOutQueueCore leaked: " + error.ToMessageWithType(), "MpxServerTransport.sendOutQueue()", error); } }
private void sendOutQueueCore(clientSiteState state, bool isManager) { const int MAX_SPINS = 50; int spins = 0; while (Interlocked.CompareExchange(ref state.LOCK_TOKEN, 1, 0) != 0) { if (!isManager) { return; } if (spins > MAX_SPINS) { return; } spins++; Thread.Sleep(10 + ExternalRandomGenerator.Instance.NextScaledRandomInteger(1, 10)); } try { //may block on this thread until send succeeds for (var i = 0; (!isManager && i == 0) || (isManager && i < GENERATIONS); i++) { var queue = state.OutQueues[i]; ResponseMsg response; while (Running && queue.TryDequeue(out response)) { if (!sendResponse(response)) { if (i < GENERATIONS - 1) { state.OutQueues[i + 1].Enqueue(response);//put back in queue what did not go in older gen queue } } } //while } //for } finally { Interlocked.Exchange(ref state.LOCK_TOKEN, 0); } }