bug 21622 - 202 branch
diff --git a/org.eclipse.jdt.debug/buildnotes_jdt-debug.html b/org.eclipse.jdt.debug/buildnotes_jdt-debug.html
index 75e67b6..5f707d5 100644
--- a/org.eclipse.jdt.debug/buildnotes_jdt-debug.html
+++ b/org.eclipse.jdt.debug/buildnotes_jdt-debug.html
@@ -11,6 +11,15 @@
 <h1>
 Eclipse Platform Build Notes&nbsp;<br>
 Java Debug</h1>
+R2.0.2 - Oct 2, 2002
+
+<h3>
+Problem Reports Fixed</h3>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=21622">21622</a>: handling disconnect/communication error<br>
+
+<h1>
+Eclipse Platform Build Notes&nbsp;<br>
+Java Debug</h1>
 R2.0.2 - Sept 18, 2002
 
 <h3>
diff --git a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketReceiveManager.java b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketReceiveManager.java
index 5a4920e..83129be 100644
--- a/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketReceiveManager.java
+++ b/org.eclipse.jdt.debug/jdi/org/eclipse/jdi/internal/connect/PacketReceiveManager.java
@@ -1,215 +1,213 @@
-package org.eclipse.jdi.internal.connect;

-

-/*

- * (c) Copyright IBM Corp. 2000, 2001.

- * All Rights Reserved.

- */

-

-import java.io.IOException;

-import java.io.InputStream;

-import java.io.InterruptedIOException;

-import java.util.LinkedList;

-import java.util.ListIterator;

-

-import org.eclipse.jdi.TimeoutException;

-import org.eclipse.jdi.internal.VirtualMachineImpl;

-import org.eclipse.jdi.internal.jdwp.JdwpCommandPacket;

-import org.eclipse.jdi.internal.jdwp.JdwpPacket;

-import org.eclipse.jdi.internal.jdwp.JdwpReplyPacket;

-

-import com.sun.jdi.VMDisconnectedException;

-

-/**

- * This class implements a thread that receives packets from the Virtual Machine.

- *

- */

-public class PacketReceiveManager extends PacketManager {

-	/** Generic timeout value for not blocking. */

-	public static final int TIMEOUT_NOT_BLOCKING = 0;

-	/** Generic timeout value for infinite timeout. */

-	public static final int TIMEOUT_INFINITE = -1;

-

-	/** Virtual Machine. */

-	private VirtualMachineImpl fVM;

-	/** Input Stream from Virtual Machine. */

-	private InputStream fInStream;

-	/** List of Command packets received from Virtual Machine. */

-	private LinkedList fCommandPackets;

-	/** List of Reply packets received from Virtual Machine. */

-	private LinkedList fReplyPackets;

-

-	/** 

-	 * Create a new thread that receives packets from the Virtual Machine.

-	 */

-	public PacketReceiveManager(ConnectorImpl connector) {

-		super(connector);

-		try {

-			fVM = connector.virtualMachine();

-			fInStream = connector.getInputStream();

-			fCommandPackets = new LinkedList();

-			fReplyPackets = new LinkedList();

-		} catch (IOException e) {

-			disconnectVM();

-		}

-	}

-

-	/** 

-	 * Thread's run method.

-	 */

-	public void run() {

-		try {

-			while (true) {

-				// Read a packet from the input stream.

-				readAvailablePacket();

-			}

-		} catch (InterruptedIOException e) {

-			// Stop running.

-		} catch (IOException e) {

-			disconnectVM();

-		}

-	}

-	

-	/** 

-	 * @return Returns a specified Command Packet from the Virtual Machine.

-	 */

-	public synchronized JdwpCommandPacket getCommand(int  command, long timeToWait) throws InterruptedException {

-		JdwpCommandPacket packet = null;

-		long remainingTime = timeToWait;

-		long timeBeforeWait;

-		long waitedTime;

-		

-		// Wait until command is available.

-		while (!VMIsDisconnected()

-					&& (packet = removeCommandPacket(command)) == null

-					&& (timeToWait < 0 || remainingTime > 0)) {

-			timeBeforeWait = System.currentTimeMillis();

-			waitForPacketAvailable(timeToWait);

-			waitedTime = System.currentTimeMillis() - timeBeforeWait;

-			remainingTime -= waitedTime;

-		}

-		

-		// Check for an IO Exception.

-		if (VMIsDisconnected())

-			throw new VMDisconnectedException(ConnectMessages.getString("PacketReceiveManager.Got_IOException_from_Virtual_Machine_1")); //$NON-NLS-1$

-			

-		// Check for a timeout.

-		if (packet == null)

-			throw new TimeoutException();

-			

-		return packet;

-	}

-	

-	/** 

-	 * @return Returns a specified Reply Packet from the Virtual Machine.

-	 */

-	public synchronized JdwpReplyPacket getReply(int id, long timeToWait) throws InterruptedException {

-		JdwpReplyPacket packet = null;

-		long remainingTime = timeToWait;

-		long timeBeforeWait;

-		long waitedTime;

-		

-		// Wait until reply is available.

-		while (!VMIsDisconnected()

-					&& (packet = removeReplyPacket(id)) == null

-					&& (timeToWait < 0 || remainingTime > 0)) {

-			timeBeforeWait = System.currentTimeMillis();

-			waitForPacketAvailable(timeToWait);

-			waitedTime = System.currentTimeMillis() - timeBeforeWait;

-			remainingTime -= waitedTime;

-		}

-		

-		// Check for an IO Exception.

-		if (VMIsDisconnected())

-			throw new VMDisconnectedException(ConnectMessages.getString("PacketReceiveManager.Got_IOException_from_Virtual_Machine_2")); //$NON-NLS-1$

-			

-		// Check for a timeout.

-		if (packet == null)

-			throw new TimeoutException();

-

-		return packet;

-	}

-	

-	/** 

-	 * @return Returns a specified Reply Packet from the Virtual Machine.

-	 */

-	public JdwpReplyPacket getReply(JdwpCommandPacket commandPacket) {

-		try {

-			return getReply(commandPacket.getId(), fVM.getRequestTimeout());

-		} catch (InterruptedException e) {

-			Thread.currentThread().interrupt();

-		}

-		return null;

-	}

-

-	/** 

-	 * Wait for an available packet from the Virtual Machine.

-	 */

-	private void waitForPacketAvailable(long timeToWait) throws InterruptedException {

-		if (timeToWait == 0)

-			return;

-		else if (timeToWait < 0)

-			wait();

-		else

-			wait(timeToWait);

-	}

-	

-	/** 

-	 * @return Returns and removes a specified command packet from the command packet list.

-	 */

-	private JdwpCommandPacket removeCommandPacket(int command) {

-		ListIterator iter = fCommandPackets.listIterator();

-		while (iter.hasNext()) {

-			JdwpCommandPacket packet = (JdwpCommandPacket)iter.next();

-			if (packet.getCommand() == command) {

-				iter.remove();

-				return packet;

-			}

-		}

-		return null;

-	}

-	

-	/** 

-	 * @return Returns a specified reply packet from the reply packet list.

-	 */

-	private JdwpReplyPacket removeReplyPacket(int id) {

-		ListIterator iter = fReplyPackets.listIterator();

-		while (iter.hasNext()) {

-			JdwpReplyPacket packet = (JdwpReplyPacket)iter.next();

-			if (packet.getId() == id) {

-				iter.remove();

-				return packet;

-			}

-		}

-		return null;

-	}

-

-	/** 

-	 * Add a command packet to the command packet list.

-	 */

-	private synchronized void addCommandPacket(JdwpCommandPacket packet) {

-		fCommandPackets.add(packet);

-		notifyAll();

-	}

-

-	/** 

-	 * Add a reply packet to the reply packet list.

-	 */

-	private synchronized void addReplyPacket(JdwpReplyPacket packet) {

-		fReplyPackets.add(packet);

-		notifyAll();

-	}

-	

-	/** 

-	 * Read a packet from the input stream and add it to the appropriate packet list.

-	 */

-	private void readAvailablePacket() throws IOException {

-		// Read a packet from the Input Stream.

-		JdwpPacket packet = JdwpPacket.read(fInStream);

-		

-		// Add packet to command or reply queue.

-		if (packet instanceof JdwpCommandPacket)

-			addCommandPacket((JdwpCommandPacket)packet);

-		else

-			addReplyPacket((JdwpReplyPacket)packet);

-	}

-}

+package org.eclipse.jdi.internal.connect;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import org.eclipse.jdi.TimeoutException;
+import org.eclipse.jdi.internal.VirtualMachineImpl;
+import org.eclipse.jdi.internal.jdwp.JdwpCommandPacket;
+import org.eclipse.jdi.internal.jdwp.JdwpPacket;
+import org.eclipse.jdi.internal.jdwp.JdwpReplyPacket;
+
+import com.sun.jdi.VMDisconnectedException;
+
+/**
+ * This class implements a thread that receives packets from the Virtual Machine.
+ *
+ */
+public class PacketReceiveManager extends PacketManager {
+	/** Generic timeout value for not blocking. */
+	public static final int TIMEOUT_NOT_BLOCKING = 0;
+	/** Generic timeout value for infinite timeout. */
+	public static final int TIMEOUT_INFINITE = -1;
+
+	/** Virtual Machine. */
+	private VirtualMachineImpl fVM;
+	/** Input Stream from Virtual Machine. */
+	private InputStream fInStream;
+	/** List of Command packets received from Virtual Machine. */
+	private LinkedList fCommandPackets;
+	/** List of Reply packets received from Virtual Machine. */
+	private LinkedList fReplyPackets;
+
+	/** 
+	 * Create a new thread that receives packets from the Virtual Machine.
+	 */
+	public PacketReceiveManager(ConnectorImpl connector) {
+		super(connector);
+		try {
+			fVM = connector.virtualMachine();
+			fInStream = connector.getInputStream();
+			fCommandPackets = new LinkedList();
+			fReplyPackets = new LinkedList();
+		} catch (IOException e) {
+			disconnectVM();
+		}
+	}
+
+	/** 
+	 * Thread's run method.
+	 */
+	public void run() {
+		try {
+			while (true) {
+				// Read a packet from the input stream.
+				readAvailablePacket();
+			}
+		} catch (InterruptedIOException e) {
+			// Stop running.
+		} catch (IOException e) {
+			disconnectVM();
+		}
+	}
+	
+	/** 
+	 * @return Returns a specified Command Packet from the Virtual Machine.
+	 */
+	public synchronized JdwpCommandPacket getCommand(int  command, long timeToWait) throws InterruptedException {
+		JdwpCommandPacket packet = null;
+		long remainingTime = timeToWait;
+		long timeBeforeWait;
+		long waitedTime;
+		
+		// Wait until command is available.
+		while (!VMIsDisconnected()
+					&& (packet = removeCommandPacket(command)) == null
+					&& (timeToWait < 0 || remainingTime > 0)) {
+			timeBeforeWait = System.currentTimeMillis();
+			waitForPacketAvailable(timeToWait);
+			waitedTime = System.currentTimeMillis() - timeBeforeWait;
+			remainingTime -= waitedTime;
+		}
+		
+		// Check for an IO Exception.
+		if (VMIsDisconnected())
+			throw new VMDisconnectedException(ConnectMessages.getString("PacketReceiveManager.Got_IOException_from_Virtual_Machine_1")); //$NON-NLS-1$
+			
+		// Check for a timeout.
+		if (packet == null)
+			throw new TimeoutException();
+			
+		return packet;
+	}
+	
+	/** 
+	 * @return Returns a specified Reply Packet from the Virtual Machine.
+	 */
+	public synchronized JdwpReplyPacket getReply(int id, long timeToWait) {
+		JdwpReplyPacket packet = null;
+		long remainingTime = timeToWait;
+		long timeBeforeWait;
+		long waitedTime;
+		
+		// Wait until reply is available.
+		while (!VMIsDisconnected()
+					&& (packet = removeReplyPacket(id)) == null
+					&& (timeToWait < 0 || remainingTime > 0)) {
+			timeBeforeWait = System.currentTimeMillis();
+			try {
+				waitForPacketAvailable(remainingTime);
+			} catch (InterruptedException e) {
+			}
+			waitedTime = System.currentTimeMillis() - timeBeforeWait;
+			remainingTime -= waitedTime;
+		}
+		
+		// Check for an IO Exception.
+		if (VMIsDisconnected())
+			throw new VMDisconnectedException(ConnectMessages.getString("PacketReceiveManager.Got_IOException_from_Virtual_Machine_2")); //$NON-NLS-1$
+			
+		// Check for a timeout.
+		if (packet == null)
+			throw new TimeoutException();
+
+		return packet;
+	}
+	
+	/** 
+	 * @return Returns a specified Reply Packet from the Virtual Machine.
+	 */
+	public JdwpReplyPacket getReply(JdwpCommandPacket commandPacket) {
+		return getReply(commandPacket.getId(), fVM.getRequestTimeout());
+	}
+
+	/** 
+	 * Wait for an available packet from the Virtual Machine.
+	 */
+	private void waitForPacketAvailable(long timeToWait) throws InterruptedException {
+		if (timeToWait == 0)
+			return;
+		else if (timeToWait < 0)
+			wait();
+		else
+			wait(timeToWait);
+	}
+	
+	/** 
+	 * @return Returns and removes a specified command packet from the command packet list.
+	 */
+	private JdwpCommandPacket removeCommandPacket(int command) {
+		ListIterator iter = fCommandPackets.listIterator();
+		while (iter.hasNext()) {
+			JdwpCommandPacket packet = (JdwpCommandPacket)iter.next();
+			if (packet.getCommand() == command) {
+				iter.remove();
+				return packet;
+			}
+		}
+		return null;
+	}
+	
+	/** 
+	 * @return Returns a specified reply packet from the reply packet list.
+	 */
+	private JdwpReplyPacket removeReplyPacket(int id) {
+		ListIterator iter = fReplyPackets.listIterator();
+		while (iter.hasNext()) {
+			JdwpReplyPacket packet = (JdwpReplyPacket)iter.next();
+			if (packet.getId() == id) {
+				iter.remove();
+				return packet;
+			}
+		}
+		return null;
+	}
+
+	/** 
+	 * Add a command packet to the command packet list.
+	 */
+	private synchronized void addCommandPacket(JdwpCommandPacket packet) {
+		fCommandPackets.add(packet);
+		notifyAll();
+	}
+
+	/** 
+	 * Add a reply packet to the reply packet list.
+	 */
+	private synchronized void addReplyPacket(JdwpReplyPacket packet) {
+		fReplyPackets.add(packet);
+		notifyAll();
+	}
+	
+	/** 
+	 * Read a packet from the input stream and add it to the appropriate packet list.
+	 */
+	private void readAvailablePacket() throws IOException {
+		// Read a packet from the Input Stream.
+		JdwpPacket packet = JdwpPacket.read(fInStream);
+		
+		// Add packet to command or reply queue.
+		if (packet instanceof JdwpCommandPacket)
+			addCommandPacket((JdwpCommandPacket)packet);
+		else
+			addReplyPacket((JdwpReplyPacket)packet);
+	}
+}