Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Associate with MI Event the command token.

Index: ChangeLog
2002-10-25 Alain Magloire

	Automatically suspend/resume gdb when setting a breakpoint.
	The workflow when debuggin which gdb command prompt is to
	hit CTRL-C set the breakpoint and continue.  The UI debugger
	should be smart enought to do this by itself.  So if the
	inferior is running, when setting a breakpoint the program
	is suspended(target.suspend()), the suspend event is ignore
	the breakpoint is set (--break-insert) and the target is resume.
	To ignore a specific event, we use a (mis)behaviour of gdb that
	associate the suspend(*stopped) with the last execution command.
	(gdb)
	111-exec-continue
	111^running
	(gdb)
	222-exec-interrupt
	222^done
	(gdb)
	111*stopped,signal-name="SIGINT",signal-meaning="Interrupt",
	frame={addr="0x00010140",func="foo",args=[],file="try.c",line="13"}
	(gdb)
	In the case above event 111 is ignore.


===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/ChangeLog,v
retrieving revision 1.20
diff -u -r1.20 ChangeLog
--- ChangeLog	24 Oct 2002 15:06:53 -0000	1.20
+++ ChangeLog	26 Oct 2002 20:20:32 -0000
@@ -1,3 +1,75 @@
+2002-10-25 Alain Magloire
+
+	Automatically suspend/resume gdb when setting a breakpoint.
+	The workflow when debuggin which gdb command prompt is to
+	hit CTRL-C set the breakpoint and continue.  The UI debugger
+	should be smart enought to do this by itself.  So if the
+	inferior is running, when setting a breakpoint the program
+	is suspended(target.suspend()), the suspend event is ignore
+	the breakpoint is set (--break-insert) and the target is resume.
+	To ignore a specific event, we use a (mis)behaviour of gdb that
+	associate the suspend(*stopped) with the last execution command.
+	(gdb)
+	111-exec-continue
+	111^running
+	(gdb)
+	222-exec-interrupt
+	222^done
+	(gdb)
+	111*stopped,signal-name="SIGINT",signal-meaning="Interrupt",
+	frame={addr="0x00010140",func="foo",args=[],file="try.c",line="13"}
+	(gdb)
+	In the case above event 111 is ignore.
+
+	* src/.../core/command/CLICommand.java (toString): Always put
+	the identifying token.
+	* src/.../core/command/Command.java (setToken): Removed.
+	(getUniqToken): New method returns a global uniq token.
+	(getToken): Returns a uniq token for the command.
+	* src/.../core/MIInferior.java (setTerminated): New argument token,
+	since now all MIEvent has the corresponding command token.
+	* src/.../core/MISession.java (cmdCount): Removed.
+	(postCommand): the command getToken() will return a uniq token.
+	* src/.../core/RxThread.java (processMIOOBRecord): MIEvent take
+	the corresponding command token as argument.
+	* src/.../core/TxThrea.java (token): Field removed, token are no
+	longer created in this tread.
+	* src/.../core/event/MIBreakpointEvent.java:
+	* src/.../core/event/MIBreakpointEvent.java:
+	* src/.../core/event/MIChangedEvent.java:
+	* src/.../core/event/MIDetachedEvent.java:
+	* src/.../core/event/MIEvent.java:
+	* src/.../core/event/MIFunctionFinishedEvent.java:
+	* src/.../core/event/MIGDBExitEvent.java:
+	* src/.../core/event/MIInferiorExitEvent.java:
+	* src/.../core/event/MILocationReachedEvent.java:
+	* src/.../core/event/MIMemoryChangedEvent.java:
+	* src/.../core/event/MIRegisterChangedEvent.java:
+	* src/.../core/event/MIRunningEvent.java:
+	* src/.../core/event/MISignalEvent.java:
+	* src/.../core/event/MISteppingRangeEvent.java:
+	* src/.../core/event/MIStoppedEvent.java:
+	* src/.../core/event/MIThreadExitEvent.java:
+	* src/.../core/event/MIVarChangedEvent.java:
+	* src/.../core/event/MIWatchpointScopeEvent.java:
+	* src/.../core/event/MIWatchpointTriggerEvent.java:
+	Calls super with getToken().
+	* src/.../core/cdi/BreakpointManager.java (allowProgramInterruption):
+	New method to allow suspending the program to set a breakpoint.
+	(suspendInferior): get the last token execution an ignore the suspend
+	event.
+	* src/.../core/cdi/CTarget.java (getLastExecutionToken): New method
+	returns the token of the last execution command.
+	* src/.../core/cdi/EventManager.java (enableEventToken): New method.
+	(enableEventTokens): New method.
+	(disableEventToken): New method.
+	(disableEventTokens): New method.
+	(update): Ignore token in the disable list.
+	* src/.../core/cdi/RegisterManager.java (update): MIEvent takes
+	a token.
+	* src/.../core/cdi/Variable.java (setValue): MIEvent takes a token.
+	* src/.../core/cdi/VariableManager.java (update): MIEvent takes a token.
+
 2002-10-24 Alain Magloire
 
 	* src/.../core/RxThread.java (processMIOutput): Fire a
Index: src/org/eclipse/cdt/debug/mi/core/MIInferior.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MIInferior.java,v
retrieving revision 1.23
diff -u -r1.23 MIInferior.java
--- src/org/eclipse/cdt/debug/mi/core/MIInferior.java	22 Oct 2002 20:27:33 -0000	1.23
+++ src/org/eclipse/cdt/debug/mi/core/MIInferior.java	26 Oct 2002 20:20:34 -0000
@@ -169,7 +169,7 @@
 				interrupt();
 				session.postCommand(abort);
 				abort.getMIInfo();
-				setTerminated(true);
+				setTerminated(abort.getToken(), true);
 			} catch (MIException e) {
 			}
 		}
@@ -226,10 +226,10 @@
 	}
 
 	public synchronized void setTerminated() {
-		setTerminated(false);
+		setTerminated(0, false);
 	}
 
-	synchronized void setTerminated(boolean fireEvent) {
+	synchronized void setTerminated(int token, boolean fireEvent) {
 		state = TERMINATED;
 		// Close the streams.
 		try {
@@ -270,7 +270,7 @@
 			}
 		}
 		if (fireEvent) {
-			session.fireEvent(new MIInferiorExitEvent());
+			session.fireEvent(new MIInferiorExitEvent(token));
 		}
 		notifyAll();
 	}
Index: src/org/eclipse/cdt/debug/mi/core/MISession.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java,v
retrieving revision 1.38
diff -u -r1.38 MISession.java
--- src/org/eclipse/cdt/debug/mi/core/MISession.java	22 Oct 2002 20:28:47 -0000	1.38
+++ src/org/eclipse/cdt/debug/mi/core/MISession.java	26 Oct 2002 20:20:33 -0000
@@ -79,9 +79,6 @@
 
 	MIInferior inferior;
 	
-	int cmdCount = 1;
-
-	
 	/**
 	 * Create the gdb session.
 	 *
@@ -256,7 +253,7 @@
 	public synchronized void postCommand(Command cmd, long timeout) throws MIException {
 
 		// TRACING: print the command;
-		MIPlugin.getDefault().debugLog(cmdCount++ + " " + cmd.toString());
+		MIPlugin.getDefault().debugLog(cmd.toString());
 
 		// Test if we are in a sane state.
 		if (!txThread.isAlive() || !rxThread.isAlive()) {
@@ -339,7 +336,7 @@
 		// Tell the observers that the session
 		// is finish, but we can not use the Event Thread.
 		// The Event Thread is being kill below.
-		notifyObservers(new MIGDBExitEvent());
+		notifyObservers(new MIGDBExitEvent(0));
 		
 		// {in,out}Channel is use as predicate/condition
 		// in the {RX,TX,Event}Thread to detect termination
Index: src/org/eclipse/cdt/debug/mi/core/RxThread.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java,v
retrieving revision 1.36
diff -u -r1.36 RxThread.java
--- src/org/eclipse/cdt/debug/mi/core/RxThread.java	24 Oct 2002 15:06:45 -0000	1.36
+++ src/org/eclipse/cdt/debug/mi/core/RxThread.java	26 Oct 2002 20:20:34 -0000
@@ -118,7 +118,7 @@
 			// Notify any command waiting for a ResultRecord.
 			MIResultRecord rr = response.getMIResultRecord();
 			if (rr != null) {
-				int id = rr.geToken();
+				int id = rr.getToken();
 				Command cmd = rxQueue.removeCommand(id);
 
 				// Check if the state changed.
@@ -143,7 +143,7 @@
 						type = MIRunningEvent.CONTINUE;
 					}
 					session.getMIInferior().setRunning();
-					MIEvent event = new MIRunningEvent(type);
+					MIEvent event = new MIRunningEvent(id, type);
 					session.fireEvent(event);
 				} else if ("exit".equals(state)) {
 					// No need to do anything, terminate() will.
@@ -153,7 +153,7 @@
 				} else if ("error".equals(state)) {
 					if (session.getMIInferior().isRunning()) {
 						session.getMIInferior().setSuspended();
-						MIEvent event = new MIStoppedEvent();
+						MIEvent event = new MIStoppedEvent(id);
 						session.fireEvent(event);
 					}
 				}
@@ -230,7 +230,7 @@
 				// "reason" ??? still fire a stopped event.
 				if (e == null) {
 					session.getMIInferior().setSuspended();
-					e = new MIStoppedEvent();
+					e = new MIStoppedEvent(exec.getToken());
 					list.add(e);
 				}
 			}
Index: src/org/eclipse/cdt/debug/mi/core/TxThread.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java,v
retrieving revision 1.14
diff -u -r1.14 TxThread.java
--- src/org/eclipse/cdt/debug/mi/core/TxThread.java	24 Oct 2002 02:43:18 -0000	1.14
+++ src/org/eclipse/cdt/debug/mi/core/TxThread.java	26 Oct 2002 20:20:35 -0000
@@ -20,13 +20,10 @@
 public class TxThread extends Thread {
 
 	MISession session;
-	int token;
 
 	public TxThread(MISession s) {
 		super("MI TX Thread");
 		session = s;
-		// start at one, zero is special means no token.
-		token = 1;
 	}
 
 	public void run () {
@@ -44,13 +41,9 @@
 				}
 
 				if (cmd != null) {
-					// Give the command a token and increment. 
-					cmd.setToken(token++);
-					// Move to the RxQueue only if we have
-					// a valid token, this is to permit input(HACK!)
-					// or commands that do not want to wait for responses.
+					// Move to the RxQueue only if RxThread is alive.
 					Thread rx = session.getRxThread();
-					if (cmd.getToken() > 0 && rx != null && rx.isAlive()) {
+					if (rx != null && rx.isAlive()) {
 						CommandQueue rxQueue = session.getRxQueue();
 						rxQueue.addCommand(cmd);
 					} else {
@@ -121,7 +114,7 @@
 		}
 		if (type != -1) {
 			session.getMIInferior().setRunning();
-			MIEvent event = new MIRunningEvent(type);
+			MIEvent event = new MIRunningEvent(cmd.getToken(), type);
 			session.fireEvent(event);
 		}
 	}
Index: src/org/eclipse/cdt/debug/mi/core/cdi/BreakpointManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/BreakpointManager.java,v
retrieving revision 1.20
diff -u -r1.20 BreakpointManager.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/BreakpointManager.java	20 Sep 2002 17:12:48 -0000	1.20
+++ src/org/eclipse/cdt/debug/mi/core/cdi/BreakpointManager.java	26 Oct 2002 20:20:53 -0000
@@ -39,10 +39,12 @@
 public class BreakpointManager extends SessionObject implements ICDIBreakpointManager {
 
 	List breakList;
+	boolean allowInterrupt;
 
 	public BreakpointManager(CSession session) {
 		super(session);
 		breakList = new ArrayList(1);
+		allowInterrupt = true;
 	}
 
 	boolean containsBreakpoint(int number) {
@@ -77,10 +79,12 @@
 		CSession s = getCSession();
 		CTarget target = s.getCTarget();
 		// Stop the program and disable events.
-		if (target.isRunning()) {
+		if (target.isRunning() && allowInterrupt) {
+			int lastToken = target.getLastExecutionToken();
 			shouldRestart = true;
-			((EventManager)s.getEventManager()).disableEvents();
+			((EventManager)s.getEventManager()).disableEventToken(lastToken);
 			target.suspend();
+			((EventManager)s.getEventManager()).enableEventToken(lastToken);
 		}
 		return shouldRestart;
 	}
@@ -90,10 +94,16 @@
 			CSession s = getCSession();
 			CTarget target = s.getCTarget();
 			target.resume();
-			((EventManager)s.getEventManager()).enableEvents();
 		}
 	}
 
+
+	/**
+	 * @see org.eclipse.cdt.debug.core.cdi.ICDIBreakpointManager#allowProgramInterruption()
+	 */
+	public void allowProgramInterruption(boolean e) {
+		allowInterrupt = e;
+	}
 
 	/**
 	 * @see org.eclipse.cdt.debug.core.cdi.ICDIBreakpointManager#deleteAllBreakpoints()
Index: src/org/eclipse/cdt/debug/mi/core/cdi/CTarget.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/CTarget.java,v
retrieving revision 1.31
diff -u -r1.31 CTarget.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/CTarget.java	20 Oct 2002 23:27:25 -0000	1.31
+++ src/org/eclipse/cdt/debug/mi/core/cdi/CTarget.java	26 Oct 2002 20:20:55 -0000
@@ -45,6 +45,7 @@
 	CThread[] noThreads = new CThread[0];
 	CThread[] currentThreads;
 	int currentThreadId;
+	int lastExecutionToken;
 	
 	public CTarget(CSession s) {
 		session = s;
@@ -55,6 +56,10 @@
 		return session;
 	}
 
+	int getLastExecutionToken() {
+		return lastExecutionToken;
+	}
+
 	/**
 	 * @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#getSession()
 	 */
@@ -236,6 +241,7 @@
 		} catch (MIException e) {
 			throw new CDIException(e.getMessage());
 		}
+		lastExecutionToken = run.getToken();
 	}
 
 	/**
@@ -257,6 +263,7 @@
 			} catch (MIException e) {
 				throw new CDIException(e.getMessage());
 			}
+			lastExecutionToken = cont.getToken();
 		} else if (mi.getMIInferior().isTerminated()) {
 			restart();
 		} else {
@@ -281,6 +288,7 @@
 		} catch (MIException e) {
 			throw new CDIException(e.getMessage());
 		}
+		lastExecutionToken = step.getToken();
 	}
 
 	/**
@@ -299,6 +307,7 @@
 		} catch (MIException e) {
 			throw new CDIException(e.getMessage());
 		}
+		lastExecutionToken = stepi.getToken();
 	}
 
 	/**
@@ -317,6 +326,7 @@
 		} catch (MIException e) {
 			throw new CDIException(e.getMessage());
 		}
+		lastExecutionToken = next.getToken();
 	}
 
 	/**
@@ -335,6 +345,7 @@
 		} catch (MIException e) {
 			throw new CDIException(e.getMessage());
 		}
+		lastExecutionToken = nexti.getToken();
 	}
 
 	/**
@@ -353,6 +364,7 @@
 		} catch (MIException e) {
 			throw new CDIException(e.getMessage());
 		}
+		lastExecutionToken = finish.getToken();
 	}
 
 	/**
@@ -384,8 +396,10 @@
 		} catch (MIException e) {
 			throw new CDIException(e.getMessage());
 		}
+		// Unfortunately -target-detach does not generate an
+		// event so we do it here.
 		MISession miSession = session.getMISession();
-		miSession.fireEvent(new MIDetachedEvent());
+		miSession.fireEvent(new MIDetachedEvent(detach.getToken()));
 		session.getMISession().getMIInferior().setDisconnected();
 	}
 
@@ -405,6 +419,7 @@
 		} catch (MIException e) {
 			throw new CDIException(e.getMessage());
 		}
+		lastExecutionToken = finish.getToken();
 	}
 
 	/**
Index: src/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java,v
retrieving revision 1.21
diff -u -r1.21 EventManager.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java	21 Oct 2002 20:38:20 -0000	1.21
+++ src/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java	26 Oct 2002 20:20:56 -0000
@@ -39,17 +39,21 @@
 public class EventManager extends SessionObject implements ICDIEventManager, Observer {
 
 	List list = Collections.synchronizedList(new ArrayList(1));
-	boolean isEnable = true;
+	List tokenList = new ArrayList(1); 
 
 	/**
-	 * Process the event from MI and do any state work on the CDI.
+	 * Process the event from MI, do any state work on the CDI,
+	 * and fire the corresponding CDI event.
 	 */
 	public void update(Observable o, Object arg) {
 		MIEvent miEvent = (MIEvent)arg;
 		CSession session = getCSession();
 		List cdiList = new ArrayList(1);
 
-		if (miEvent instanceof MIStoppedEvent) {
+		if (ignoreEventToken(miEvent.getToken())) {
+				miEvent = miEvent;
+			// Ignore the event if it is on the ignore list.
+		} else if (miEvent instanceof MIStoppedEvent) {
 			processSuspendedEvent(miEvent);
 			cdiList.add(new SuspendedEvent(session, miEvent));
 		} else if (miEvent instanceof MIRunningEvent) {
@@ -90,10 +94,8 @@
 		}
 
 		// Fire the event;
-		if (isEnable) {
-			ICDIEvent[] cdiEvents = (ICDIEvent[])cdiList.toArray(new ICDIEvent[0]);
-			fireEvent(cdiEvents);
-		}
+		ICDIEvent[] cdiEvents = (ICDIEvent[])cdiList.toArray(new ICDIEvent[0]);
+		fireEvents(cdiEvents);
 	}
 
 	public EventManager(CSession session) {
@@ -114,7 +116,11 @@
 		list.remove(listener);
 	}
 
-	private void fireEvent(ICDIEvent[] cdiEvents) {
+
+	/**
+	 * Send ICDIEvent to the listeners.
+	 */
+	private void fireEvents(ICDIEvent[] cdiEvents) {
 		if (cdiEvents != null) {
 			for (int i = 0; i < cdiEvents.length; i++) {
 				fireEvent(cdiEvents[i]);
@@ -122,6 +128,9 @@
 		}
 	}
 
+	/**
+	 * Send ICDIEvent to the listeners.
+	 */
 	private void fireEvent(ICDIEvent cdiEvent) {
 		if (cdiEvent != null) {
 			ICDIEventListener[] listeners =
@@ -178,18 +187,51 @@
 		}
 	}
 
+	/**
+	 * Do any processing of before a running event.
+	 */
 	void processRunningEvent() {
 		//CTarget target = getCSession().getCTarget();
 		//target.clearState();
 	}
 
 
-	void disableEvents() {
-		isEnable = false;
+	/**
+	 * Ignore Event with token id.
+	 */
+	void disableEventToken(int token) {
+		tokenList.add(new Integer(token));
+	}
+
+	/**
+	 * Ignore events with token ids.
+	 */
+	void disableEventTokens(int [] tokens) {
+		for (int i = 0; i < tokens.length; i++) {
+			disableEventToken(tokens[i]);
+		}
+	}
+
+	/**
+	 * Reenable sending events with this token.
+	 */
+	void enableEventToken(int token) {
+		Integer t = new Integer(token);
+		if (tokenList.contains(t)) {
+			tokenList.remove(t);
+		}
 	}
 
-	void enableEvents() {
-		isEnable = true;
+	/**
+	 * Reenable sending events with this token.
+	 */
+	void enableEventTokens(int [] tokens) {
+		for (int i = 0; i < tokens.length; i++) {
+			enableEventToken(tokens[i]);
+		}
 	}
 
+	private boolean ignoreEventToken(int token) {
+		return tokenList.contains(new Integer(token));
+	}
 }
Index: src/org/eclipse/cdt/debug/mi/core/cdi/RegisterManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/RegisterManager.java,v
retrieving revision 1.1
diff -u -r1.1 RegisterManager.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/RegisterManager.java	2 Oct 2002 04:51:01 -0000	1.1
+++ src/org/eclipse/cdt/debug/mi/core/cdi/RegisterManager.java	26 Oct 2002 20:20:53 -0000
@@ -113,7 +113,7 @@
 			for (int i = 0 ; i < regnos.length; i++) {
 				Register reg = getRegister(regnos[i]);
 				if (reg != null) {
-					eventList.add(new MIRegisterChangedEvent(reg.getName(), regnos[i]));
+					eventList.add(new MIRegisterChangedEvent(changed.getToken(), reg.getName(), regnos[i]));
 				}
 			}
 			MIEvent[] events = (MIEvent[])eventList.toArray(new MIEvent[0]);
Index: src/org/eclipse/cdt/debug/mi/core/cdi/Variable.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/Variable.java,v
retrieving revision 1.9
diff -u -r1.9 Variable.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/Variable.java	12 Sep 2002 18:55:31 -0000	1.9
+++ src/org/eclipse/cdt/debug/mi/core/cdi/Variable.java	26 Oct 2002 20:20:53 -0000
@@ -93,8 +93,7 @@
 		}
 		
 		// If the assign was succesfull fire a MIVarChangedEvent()
-		// FIXME: Is this necessary?
-		MIVarChangedEvent change = new MIVarChangedEvent(miVar.getVarName(), true);
+		MIVarChangedEvent change = new MIVarChangedEvent(var.getToken(), miVar.getVarName(), true);
 		mi.fireEvent(change);
 	}
 
Index: src/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java,v
retrieving revision 1.9
diff -u -r1.9 VariableManager.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java	9 Oct 2002 14:08:42 -0000	1.9
+++ src/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java	26 Oct 2002 20:20:55 -0000
@@ -105,7 +105,7 @@
 				String varName = changes[i].getVarName();
 				Element element = getElement(varName);
 				if (element != null) {
-					eventList.add( new MIVarChangedEvent(varName, changes[i].isInScope()));
+					eventList.add(new MIVarChangedEvent(update.getToken(), varName, changes[i].isInScope()));
 				}
 				if (! changes[i].isInScope()) {
 					// Only remove ICDIVariables.
Index: src/org/eclipse/cdt/debug/mi/core/command/CLICommand.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CLICommand.java,v
retrieving revision 1.11
diff -u -r1.11 CLICommand.java
--- src/org/eclipse/cdt/debug/mi/core/command/CLICommand.java	24 Oct 2002 02:41:42 -0000	1.11
+++ src/org/eclipse/cdt/debug/mi/core/command/CLICommand.java	26 Oct 2002 20:20:51 -0000
@@ -30,13 +30,7 @@
 	 * @return the text representation of this command
 	 */
 	public String toString(){
-		String str = null;
-		int t = getToken();
-		if (t > 0) {
-			str = Integer.toString(t) + " " + operation;
-		} else {
-			str = operation;
-		}  
+		String str = getToken() + " " + operation;
 		if (str.endsWith("\n"))
 			return str;
 		return str + "\n";
Index: src/org/eclipse/cdt/debug/mi/core/command/Command.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/Command.java,v
retrieving revision 1.8
diff -u -r1.8 Command.java
--- src/org/eclipse/cdt/debug/mi/core/command/Command.java	8 Aug 2002 04:07:00 -0000	1.8
+++ src/org/eclipse/cdt/debug/mi/core/command/Command.java	26 Oct 2002 20:20:50 -0000
@@ -15,21 +15,40 @@
  */
 public abstract class Command
 {
+	private static int globalCounter;
+
 	int token = 0;
 	MIOutput output;
 
 	/**
+	 * A global counter for all command, the token
+	 * will be use to identify uniquely a command.
+	 * Unless the value wraps around which is unlikely.
+	 */
+	private static synchronized int getUniqToken() {
+		int count = ++globalCounter;
+		// If we ever wrap around.
+		if (count <= 0) {
+			count = globalCounter = 1;
+		}
+		return count;
+	}
+
+	/**
 	 * Returns the identifier of this request.
 	 * 
 	 * @return the identifier of this request
 	 */
 	public int getToken() {
+		if (token == 0) {
+			token = getUniqToken();
+		}
 		return token;
 	}
 	
-	public void setToken(int token) {
-		this.token = token;
-	}
+//	public void setToken(int token) {
+//		this.token = token;
+//	}
 
 	public MIOutput getMIOutput() {
 		return output;
Index: src/org/eclipse/cdt/debug/mi/core/event/MIBreakpointEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIBreakpointEvent.java,v
retrieving revision 1.5
diff -u -r1.5 MIBreakpointEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIBreakpointEvent.java	27 Aug 2002 03:47:09 -0000	1.5
+++ src/org/eclipse/cdt/debug/mi/core/event/MIBreakpointEvent.java	26 Oct 2002 20:20:36 -0000
@@ -27,11 +27,13 @@
 	MIResultRecord rr;
 
 	public MIBreakpointEvent(MIExecAsyncOutput record) {
+		super(record.getToken());
 		exec = record;
 		parse();
 	}
 
 	public MIBreakpointEvent(MIResultRecord record) {
+		super(record.getToken());
 		rr = record;
 		parse();
 	}
Index: src/org/eclipse/cdt/debug/mi/core/event/MIChangedEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIChangedEvent.java,v
retrieving revision 1.1
diff -u -r1.1 MIChangedEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIChangedEvent.java	2 Oct 2002 04:55:12 -0000	1.1
+++ src/org/eclipse/cdt/debug/mi/core/event/MIChangedEvent.java	26 Oct 2002 20:20:36 -0000
@@ -12,4 +12,7 @@
  *
  */
 public abstract class MIChangedEvent extends MIEvent {
+	public MIChangedEvent(int id) {
+		super(id);
+	}
 }
Index: src/org/eclipse/cdt/debug/mi/core/event/MIDetachedEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIDetachedEvent.java,v
retrieving revision 1.2
diff -u -r1.2 MIDetachedEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIDetachedEvent.java	9 Oct 2002 14:08:42 -0000	1.2
+++ src/org/eclipse/cdt/debug/mi/core/event/MIDetachedEvent.java	26 Oct 2002 20:20:36 -0000
@@ -13,7 +13,8 @@
  */
 public class MIDetachedEvent extends MIEvent {
 
-	public MIDetachedEvent() {
+	public MIDetachedEvent(int token) {
+		super(token);
 	}
 
 	public String toString() {
Index: src/org/eclipse/cdt/debug/mi/core/event/MIEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIEvent.java,v
retrieving revision 1.2
diff -u -r1.2 MIEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIEvent.java	26 Aug 2002 05:24:14 -0000	1.2
+++ src/org/eclipse/cdt/debug/mi/core/event/MIEvent.java	26 Oct 2002 20:20:36 -0000
@@ -8,4 +8,14 @@
 /**
  */
 public abstract class MIEvent {
+
+	int token;
+
+	public MIEvent(int token) {
+		this.token = token;
+	}
+
+	public int getToken() {
+		return token;
+	}
 }
Index: src/org/eclipse/cdt/debug/mi/core/event/MIFunctionFinishedEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIFunctionFinishedEvent.java,v
retrieving revision 1.3
diff -u -r1.3 MIFunctionFinishedEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIFunctionFinishedEvent.java	27 Aug 2002 03:47:09 -0000	1.3
+++ src/org/eclipse/cdt/debug/mi/core/event/MIFunctionFinishedEvent.java	26 Oct 2002 20:20:35 -0000
@@ -26,12 +26,14 @@
 	MIExecAsyncOutput exec;
 	MIResultRecord rr;
 
-	public MIFunctionFinishedEvent(MIExecAsyncOutput record) {
-		exec = record;
+	public MIFunctionFinishedEvent(MIExecAsyncOutput async) {
+		super(async.getToken());
+		exec = async;
 		parse();
 	}
 
 	public MIFunctionFinishedEvent(MIResultRecord record) {
+		super(record.getToken());
 		rr = record;
 		parse();
 	}
Index: src/org/eclipse/cdt/debug/mi/core/event/MIGDBExitEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIGDBExitEvent.java,v
retrieving revision 1.1
diff -u -r1.1 MIGDBExitEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIGDBExitEvent.java	26 Aug 2002 05:24:14 -0000	1.1
+++ src/org/eclipse/cdt/debug/mi/core/event/MIGDBExitEvent.java	26 Oct 2002 20:20:36 -0000
@@ -11,4 +11,8 @@
  * Gdb Session terminated.
  */
 public class MIGDBExitEvent extends MIEvent {
+
+	public MIGDBExitEvent(int token) {
+		super(token);
+	}
 }
Index: src/org/eclipse/cdt/debug/mi/core/event/MIInferiorExitEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIInferiorExitEvent.java,v
retrieving revision 1.4
diff -u -r1.4 MIInferiorExitEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIInferiorExitEvent.java	7 Oct 2002 17:18:39 -0000	1.4
+++ src/org/eclipse/cdt/debug/mi/core/event/MIInferiorExitEvent.java	26 Oct 2002 20:20:35 -0000
@@ -26,15 +26,18 @@
         MIExecAsyncOutput exec = null;
         MIResultRecord rr = null;
 
-	public MIInferiorExitEvent() {
+	public MIInferiorExitEvent(int token) {
+		super(token);
 	}
 
-	public MIInferiorExitEvent(MIExecAsyncOutput record) {
-		exec = record;
+	public MIInferiorExitEvent(MIExecAsyncOutput async) {
+		super(async.getToken());
+		exec = async;
 		parse();
 	}
 
 	public MIInferiorExitEvent(MIResultRecord record) {
+		super(record.getToken());
 		rr = record;
 		parse();
 	}
Index: src/org/eclipse/cdt/debug/mi/core/event/MILocationReachedEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MILocationReachedEvent.java,v
retrieving revision 1.3
diff -u -r1.3 MILocationReachedEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MILocationReachedEvent.java	27 Aug 2002 03:47:09 -0000	1.3
+++ src/org/eclipse/cdt/debug/mi/core/event/MILocationReachedEvent.java	26 Oct 2002 20:20:50 -0000
@@ -24,12 +24,14 @@
 	MIExecAsyncOutput exec;
 	MIResultRecord rr;
 
-	public MILocationReachedEvent(MIExecAsyncOutput record) {
-		exec = record;
+	public MILocationReachedEvent(MIExecAsyncOutput async) {
+		super(async.getToken());
+		exec = async;
 		parse();
 	}
 
 	public MILocationReachedEvent(MIResultRecord record) {
+		super(record.getToken());
 		rr = record;
 		parse();
 	}
Index: src/org/eclipse/cdt/debug/mi/core/event/MIMemoryChangedEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIMemoryChangedEvent.java,v
retrieving revision 1.1
diff -u -r1.1 MIMemoryChangedEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIMemoryChangedEvent.java	19 Oct 2002 19:20:55 -0000	1.1
+++ src/org/eclipse/cdt/debug/mi/core/event/MIMemoryChangedEvent.java	26 Oct 2002 20:20:36 -0000
@@ -14,7 +14,13 @@
 public class MIMemoryChangedEvent extends MIChangedEvent {
 
 	Long[] addresses;
+
 	public MIMemoryChangedEvent(Long[] addrs) {
+		this(0, addrs);
+	}
+
+	public MIMemoryChangedEvent(int token, Long[] addrs) {
+		super(token);
 		addresses = addrs;
 	}
 
Index: src/org/eclipse/cdt/debug/mi/core/event/MIRegisterChangedEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIRegisterChangedEvent.java,v
retrieving revision 1.1
diff -u -r1.1 MIRegisterChangedEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIRegisterChangedEvent.java	2 Oct 2002 04:55:21 -0000	1.1
+++ src/org/eclipse/cdt/debug/mi/core/event/MIRegisterChangedEvent.java	26 Oct 2002 20:20:35 -0000
@@ -13,19 +13,20 @@
  */
 public class MIRegisterChangedEvent extends MIChangedEvent {
 
-		String regName;
-		int regno;
+	String regName;
+	int regno;
 
-		public MIRegisterChangedEvent(String name, int no) {
-			regName = name;
-			regno = no;
-		}
+	public MIRegisterChangedEvent(int token, String name, int no) {
+		super(token);
+		regName = name;
+		regno = no;
+	}
 
-		public String getName() {
-			return regName;
-		}
+	public String getName() {
+		return regName;
+	}
 
-		public int getNumber() {
-			return regno;
-		}
+	public int getNumber() {
+		return regno;
+	}
 }
Index: src/org/eclipse/cdt/debug/mi/core/event/MIRunningEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIRunningEvent.java,v
retrieving revision 1.5
diff -u -r1.5 MIRunningEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIRunningEvent.java	9 Oct 2002 14:08:42 -0000	1.5
+++ src/org/eclipse/cdt/debug/mi/core/event/MIRunningEvent.java	26 Oct 2002 20:20:50 -0000
@@ -23,7 +23,8 @@
 
 	int type;
 
-	public MIRunningEvent(int t) {
+	public MIRunningEvent(int token, int t) {
+		super(token);
 		type = t;
 	}
 
Index: src/org/eclipse/cdt/debug/mi/core/event/MISignalEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MISignalEvent.java,v
retrieving revision 1.4
diff -u -r1.4 MISignalEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MISignalEvent.java	27 Aug 2002 03:47:09 -0000	1.4
+++ src/org/eclipse/cdt/debug/mi/core/event/MISignalEvent.java	26 Oct 2002 20:20:36 -0000
@@ -27,12 +27,14 @@
 	MIExecAsyncOutput exec;
 	MIResultRecord rr;
 
-	public MISignalEvent(MIExecAsyncOutput record) {
-		exec = record;
+	public MISignalEvent(MIExecAsyncOutput async) {
+		super(async.getToken());
+		exec = async;
 		parse();
 	}
 
 	public MISignalEvent(MIResultRecord record) {
+		super(record.getToken());
 		rr = record;
 		parse();
 	}
Index: src/org/eclipse/cdt/debug/mi/core/event/MISteppingRangeEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MISteppingRangeEvent.java,v
retrieving revision 1.3
diff -u -r1.3 MISteppingRangeEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MISteppingRangeEvent.java	27 Aug 2002 03:47:09 -0000	1.3
+++ src/org/eclipse/cdt/debug/mi/core/event/MISteppingRangeEvent.java	26 Oct 2002 20:20:36 -0000
@@ -25,12 +25,14 @@
 	MIExecAsyncOutput exec;
 	MIResultRecord rr;
 
-	public MISteppingRangeEvent(MIExecAsyncOutput record) {
-		exec = record;
+	public MISteppingRangeEvent(MIExecAsyncOutput async) {
+		super(async.getToken());
+		exec = async;
 		parse();
 	}
 
 	public MISteppingRangeEvent(MIResultRecord record) {
+		super(record.getToken());
 		rr = record;
 		parse();
 	}
Index: src/org/eclipse/cdt/debug/mi/core/event/MIStoppedEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIStoppedEvent.java,v
retrieving revision 1.2
diff -u -r1.2 MIStoppedEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIStoppedEvent.java	9 Oct 2002 14:08:42 -0000	1.2
+++ src/org/eclipse/cdt/debug/mi/core/event/MIStoppedEvent.java	26 Oct 2002 20:20:36 -0000
@@ -13,6 +13,7 @@
  */
 public class MIStoppedEvent extends MIEvent {
 
-	public MIStoppedEvent() {
+	public MIStoppedEvent(int token) {
+		super(token);
 	}
 }
Index: src/org/eclipse/cdt/debug/mi/core/event/MIThreadExitEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIThreadExitEvent.java,v
retrieving revision 1.2
diff -u -r1.2 MIThreadExitEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIThreadExitEvent.java	19 Oct 2002 19:21:05 -0000	1.2
+++ src/org/eclipse/cdt/debug/mi/core/event/MIThreadExitEvent.java	26 Oct 2002 20:20:36 -0000
@@ -15,6 +15,11 @@
 	int tid;
 
 	public MIThreadExitEvent(int id) {
+		this(0, id);
+	}
+
+	public MIThreadExitEvent(int token, int id) {
+		super(token);
 		tid = id;
 	}
 
Index: src/org/eclipse/cdt/debug/mi/core/event/MIVarChangedEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIVarChangedEvent.java,v
retrieving revision 1.3
diff -u -r1.3 MIVarChangedEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIVarChangedEvent.java	19 Oct 2002 19:21:14 -0000	1.3
+++ src/org/eclipse/cdt/debug/mi/core/event/MIVarChangedEvent.java	26 Oct 2002 20:20:36 -0000
@@ -16,7 +16,8 @@
 	String varName;
 	boolean inScope;
 
-	public MIVarChangedEvent(String var, boolean scope) {
+	public MIVarChangedEvent(int token, String var, boolean scope) {
+		super(token);
 		varName = var;
 		inScope = scope;
 	}
Index: src/org/eclipse/cdt/debug/mi/core/event/MIWatchpointScopeEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIWatchpointScopeEvent.java,v
retrieving revision 1.1
diff -u -r1.1 MIWatchpointScopeEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIWatchpointScopeEvent.java	6 Sep 2002 20:18:34 -0000	1.1
+++ src/org/eclipse/cdt/debug/mi/core/event/MIWatchpointScopeEvent.java	26 Oct 2002 20:20:35 -0000
@@ -26,12 +26,14 @@
 	MIExecAsyncOutput exec;
 	MIResultRecord rr;
 
-	public MIWatchpointScopeEvent(MIExecAsyncOutput record) {
-		exec = record;
+	public MIWatchpointScopeEvent(MIExecAsyncOutput async) {
+		super(async.getToken());
+		exec = async;
 		parse();
 	}
 
 	public MIWatchpointScopeEvent(MIResultRecord record) {
+		super(record.getToken());
 		rr = record;
 		parse();
 	}
Index: src/org/eclipse/cdt/debug/mi/core/event/MIWatchpointTriggerEvent.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/event/MIWatchpointTriggerEvent.java,v
retrieving revision 1.1
diff -u -r1.1 MIWatchpointTriggerEvent.java
--- src/org/eclipse/cdt/debug/mi/core/event/MIWatchpointTriggerEvent.java	6 Sep 2002 20:18:34 -0000	1.1
+++ src/org/eclipse/cdt/debug/mi/core/event/MIWatchpointTriggerEvent.java	26 Oct 2002 20:20:36 -0000
@@ -29,12 +29,14 @@
 	MIExecAsyncOutput exec;
 	MIResultRecord rr;
 
-	public MIWatchpointTriggerEvent(MIExecAsyncOutput record) {
-		exec = record;
+	public MIWatchpointTriggerEvent(MIExecAsyncOutput async) {
+		super(async.getToken());
+		exec = async;
 		parse();
 	}
 
 	public MIWatchpointTriggerEvent(MIResultRecord record) {
+		super(record.getToken());
 		rr = record;
 		parse();
 	}
Index: src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java,v
retrieving revision 1.7
diff -u -r1.7 MIResultRecord.java
--- src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java	8 Aug 2002 04:07:00 -0000	1.7
+++ src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java	26 Oct 2002 20:20:51 -0000
@@ -20,7 +20,7 @@
 	String resultClass = "";
 	int token = -1;
 
-	public int geToken() {
+	public int getToken() {
 		return token;
 	}
 



Back to the top