diff options
author | Alain Magloire | 2004-09-12 13:24:34 +0000 |
---|---|---|
committer | Alain Magloire | 2004-09-12 13:24:34 +0000 |
commit | 7c28610f550b8178e92e936c54ab48dfc8a7f4d2 (patch) | |
tree | 6b5aa597339db9c3970c2acb04bbd82c7fbab255 /debug | |
parent | 057edb19f313eb6ff6904982749f325f4ccf1368 (diff) | |
download | org.eclipse.cdt-7c28610f550b8178e92e936c54ab48dfc8a7f4d2.tar.gz org.eclipse.cdt-7c28610f550b8178e92e936c54ab48dfc8a7f4d2.tar.xz org.eclipse.cdt-7c28610f550b8178e92e936c54ab48dfc8a7f4d2.zip |
2004-09-12 Alain Magloire
Since MISession is attach to the Target, the
way we fire termination events must change also.
* cdi/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java
* cdi/org/eclipse/cdt/debug/mi/core/cdi/ProcessManager.java
* cdi/org/eclipse/cdt/debug/mi/core/cdi/Session.java
* cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java
* src/org/eclipse/cdt/debug/mi/core/MISession.java
Diffstat (limited to 'debug')
6 files changed, 45 insertions, 9 deletions
diff --git a/debug/org.eclipse.cdt.debug.mi.core/ChangeLog b/debug/org.eclipse.cdt.debug.mi.core/ChangeLog index d15fac5fde8..8bfcebc3e71 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/ChangeLog +++ b/debug/org.eclipse.cdt.debug.mi.core/ChangeLog @@ -1,3 +1,12 @@ +2004-09-12 Alain Magloire + Since MISession is attach to the Target, the + way we fire termination events must change also. + * cdi/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java + * cdi/org/eclipse/cdt/debug/mi/core/cdi/ProcessManager.java + * cdi/org/eclipse/cdt/debug/mi/core/cdi/Session.java + * cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java + * src/org/eclipse/cdt/debug/mi/core/MISession.java + 2004-09-09 Alain Magloire Introduction of new classes in the CDI interface ICDIExecuteStep diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java index 1859d4c19cc..fd9e284ca7c 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java @@ -162,7 +162,11 @@ public class EventManager extends SessionObject implements ICDIEventManager, Obs } else if (miEvent instanceof MIInferiorExitEvent) { cdiList.add(new ExitedEvent(session, (MIInferiorExitEvent)miEvent)); } else if (miEvent instanceof MIGDBExitEvent) { - cdiList.add(new DestroyedEvent(session)); + // Remove the target from the list. + Target target = session.getTarget(miEvent.getMISession()); + if (target != null) { + session.removeTargets(new Target[] { target }); + } } else if (miEvent instanceof MIDetachedEvent) { cdiList.add(new DisconnectedEvent(session, (MIDetachedEvent)miEvent)); } else if (miEvent instanceof MIBreakpointDeletedEvent) { @@ -233,11 +237,14 @@ public class EventManager extends SessionObject implements ICDIEventManager, Obs list.remove(listener); } + public void removeEventListeners() { + list.clear(); + } /** * Send ICDIEvent to the listeners. */ - private void fireEvents(ICDIEvent[] cdiEvents) { + public void fireEvents(ICDIEvent[] cdiEvents) { if (cdiEvents != null && cdiEvents.length > 0) { ICDIEventListener[] listeners = (ICDIEventListener[])list.toArray(new ICDIEventListener[0]); for (int i = 0; i < listeners.length; i++) { diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/ProcessManager.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/ProcessManager.java index b9152729b2b..7ad78295373 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/ProcessManager.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/ProcessManager.java @@ -63,7 +63,6 @@ public class ProcessManager extends Manager { Target target = targets[i]; MISession miSession = target.getMISession(); if (miSession != null) { - miSession.notifyObservers(new MIInferiorExitEvent(miSession, 0)); miSession.deleteObserver(eventManager); } if (currentTarget != null && currentTarget.equals(target)) { diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/Session.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/Session.java index 32197a7af97..c295ec461f7 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/Session.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/Session.java @@ -26,9 +26,11 @@ import org.eclipse.cdt.debug.core.cdi.ICDISharedLibraryManager; import org.eclipse.cdt.debug.core.cdi.ICDISignalManager; import org.eclipse.cdt.debug.core.cdi.ICDISourceManager; import org.eclipse.cdt.debug.core.cdi.ICDIVariableManager; +import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent; import org.eclipse.cdt.debug.core.cdi.model.ICDITarget; import org.eclipse.cdt.debug.mi.core.MIException; import org.eclipse.cdt.debug.mi.core.MISession; +import org.eclipse.cdt.debug.mi.core.cdi.event.DestroyedEvent; import org.eclipse.cdt.debug.mi.core.cdi.model.Target; import org.eclipse.cdt.debug.mi.core.command.CommandFactory; import org.eclipse.cdt.debug.mi.core.command.MIEnvironmentDirectory; @@ -245,12 +247,30 @@ public class Session implements ICDISession, ICDISessionObject { ProcessManager pMgr = getProcessManager(); Target[] targets = pMgr.getTargets(); for (int i = 0; i < targets.length; ++i) { - if (!targets[i].isTerminated()) { - targets[i].terminate(); + if (!targets[i].getMISession().isTerminated()) { + targets[i].getMISession().terminate(); } } - //TODO: the ExitEvent is sent by MISession.terminate() - // We nee move it here. + // Do not do the removeTargets(), Target.getMISession().terminate() will do it + // via an event, MIGDBExitEvent of the mi session + //removeTargets(targets); + + // wait ~2 seconds for the targets to be terminated. + for (int i = 0; i < 2; ++i) { + targets = pMgr.getTargets(); + if (targets.length == 0) { + break; + } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // + } + } + // send our goodbyes. + EventManager eMgr = (EventManager)getEventManager(); + eMgr.fireEvents(new ICDIEvent[] { new DestroyedEvent(this) }); + eMgr.removeEventListeners(); } /** * @deprecated diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java index 5400e2e875a..f0f1e7ac377 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java @@ -653,8 +653,6 @@ public class Target implements ICDITarget { miSession.getMIInferior().terminate(); } catch (MIException e) { throw new MI2CDIException(e); - } finally { - miSession.terminate(); } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java index 903460bafd0..3eda9d3e366 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java @@ -482,6 +482,9 @@ public class MISession extends Observable { // Tell the observers that the session is terminated notifyObservers(new MIGDBExitEvent(this, 0)); + + // Should not be necessary but just to be safe. + deleteObservers(); } /** |