/// <summary> /// Write queued packets /// </summary> private void WriteLoop() { var myThread = Thread.CurrentThread; var errorCount = 0; while ((writeThread == myThread)) { // Too many errors or disconnected? if ((errorCount > MaxWriteErrors) || !tcpClient.Connected) { Disconnect.Fire(this); return; } JdwpPacket packet = null; lock (writeQueueLock) { if ((writeQueue.Count == 0) || (state == States.AwaitingHandshake)) { // Signal all waiters Monitor.PulseAll(writeQueueLock); // Now wait ourselves for new packets Monitor.Wait(writeQueueLock); } else { packet = writeQueue.Dequeue(); } } // Disconnected? if (!tcpClient.Connected) { Disconnect.Fire(this); return; } if ((packet != null) && (writeThread == myThread)) { var attempt = 0; var succeeded = false; while ((attempt < WriteAttempts) && !succeeded) { try { attempt++; DLog.Debug(DContext.DebuggerLibJdwpConnection, "Write {0}", packet); packet.WriteTo(tcpClient.GetStream()); succeeded = true; errorCount = Math.Max(errorCount - 1, 0); } catch { } } if (!succeeded) { errorCount++; } } } }