예제 #1
0
        /// <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++;
                    }
                }
            }
        }