Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java')
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java542
1 files changed, 0 insertions, 542 deletions
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
deleted file mode 100644
index 11bdda88bb2..00000000000
--- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/EventManager.java
+++ /dev/null
@@ -1,542 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2012 QNX Software Systems and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * QNX Software Systems - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.mi.core.cdi;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Observable;
-import java.util.Observer;
-
-import org.eclipse.cdt.debug.core.cdi.CDIException;
-import org.eclipse.cdt.debug.core.cdi.ICDIEventManager;
-import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
-import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame;
-import org.eclipse.cdt.debug.mi.core.MIException;
-import org.eclipse.cdt.debug.mi.core.MIPlugin;
-import org.eclipse.cdt.debug.mi.core.MISession;
-import org.eclipse.cdt.debug.mi.core.cdi.event.ChangedEvent;
-import org.eclipse.cdt.debug.mi.core.cdi.event.CreatedEvent;
-import org.eclipse.cdt.debug.mi.core.cdi.event.DestroyedEvent;
-import org.eclipse.cdt.debug.mi.core.cdi.event.DisconnectedEvent;
-import org.eclipse.cdt.debug.mi.core.cdi.event.ExitedEvent;
-import org.eclipse.cdt.debug.mi.core.cdi.event.MemoryChangedEvent;
-import org.eclipse.cdt.debug.mi.core.cdi.event.ResumedEvent;
-import org.eclipse.cdt.debug.mi.core.cdi.event.SuspendedEvent;
-import org.eclipse.cdt.debug.mi.core.cdi.model.MemoryBlock;
-import org.eclipse.cdt.debug.mi.core.cdi.model.Target;
-import org.eclipse.cdt.debug.mi.core.cdi.model.Thread;
-import org.eclipse.cdt.debug.mi.core.command.Command;
-import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
-import org.eclipse.cdt.debug.mi.core.command.MIExecContinue;
-import org.eclipse.cdt.debug.mi.core.command.MIExecFinish;
-import org.eclipse.cdt.debug.mi.core.command.MIStackInfoDepth;
-import org.eclipse.cdt.debug.mi.core.command.MIStackSelectFrame;
-import org.eclipse.cdt.debug.mi.core.command.MIThreadSelect;
-import org.eclipse.cdt.debug.mi.core.event.MIBreakpointChangedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIBreakpointCreatedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIBreakpointDeletedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIChangedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MICreatedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIDestroyedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIDetachedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIGDBExitEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIInferiorCreatedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIInferiorExitEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIInferiorSignalExitEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIMemoryChangedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIMemoryCreatedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIRegisterChangedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIRegisterCreatedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIRunningEvent;
-import org.eclipse.cdt.debug.mi.core.event.MISharedLibChangedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MISharedLibCreatedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MISharedLibEvent;
-import org.eclipse.cdt.debug.mi.core.event.MISharedLibUnloadedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MISignalChangedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIStoppedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIThreadCreatedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIThreadExitEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIVarChangedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIVarCreatedEvent;
-import org.eclipse.cdt.debug.mi.core.event.MIVarDeletedEvent;
-import org.eclipse.cdt.debug.mi.core.output.MIInfo;
-import org.eclipse.cdt.debug.mi.core.output.MIStackInfoDepthInfo;
-
-/**
- */
-public class EventManager extends SessionObject implements ICDIEventManager, Observer {
-
- List list = Collections.synchronizedList(new ArrayList(1));
- MIRunningEvent lastRunningEvent;
- Command lastUserCommand = null;
- boolean fAllowProcessingEvents = true;
- /**
- * Process the event from MI, do any state work on the CDI,
- * and fire the corresponding CDI event.
- */
- @Override
- public void update(Observable o, Object arg) {
-
- MIEvent miEvent = (MIEvent)arg;
- Session session = (Session)getSession();
- Target currentTarget = session.getTarget(miEvent.getMISession());
- if (currentTarget == null) {
- return; // bailout; this no concern to us. But we should Assert.
- }
- List cdiList = new ArrayList(1);
-
- if (miEvent instanceof MIStoppedEvent) {
- if (processSuspendedEvent((MIStoppedEvent)miEvent)) {
- cdiList.add(new SuspendedEvent(session, miEvent));
- }
- } else if (miEvent instanceof MIRunningEvent) {
- if (processRunningEvent((MIRunningEvent)miEvent))
- cdiList.add(new ResumedEvent(session, (MIRunningEvent)miEvent));
- } else if (miEvent instanceof MIChangedEvent) {
- if (miEvent instanceof MIVarChangedEvent) {
- cdiList.add(new ChangedEvent(session, (MIVarChangedEvent)miEvent));
- } else if (miEvent instanceof MIRegisterChangedEvent) {
- cdiList.add(new ChangedEvent(session, (MIRegisterChangedEvent)miEvent));
- } else if (miEvent instanceof MIMemoryChangedEvent) {
- // We need to fire an event for all the register blocks
- // that may contain the modified addresses.
- MemoryManager mgr = session.getMemoryManager();
- MemoryBlock[] blocks = mgr.getMemoryBlocks(miEvent.getMISession());
- MIMemoryChangedEvent miMem = (MIMemoryChangedEvent)miEvent;
- BigInteger[] addresses = miMem.getAddresses();
- for (int i = 0; i < blocks.length; i++) {
- if (blocks[i].contains(addresses) &&
- (! blocks[i].isFrozen() || blocks[i].isDirty())) {
- cdiList.add(new MemoryChangedEvent(session, blocks[i], miMem));
- blocks[i].setDirty(false);
- }
- }
- } else if (miEvent instanceof MIBreakpointChangedEvent) {
- MIBreakpointChangedEvent bpoint = (MIBreakpointChangedEvent)miEvent;
- if (bpoint.getNumber() > 0) {
- cdiList.add(new ChangedEvent(session, bpoint));
- } else {
- try {
- // Pass the event to access to the event's hint
- // https://bugs.eclipse.org/bugs/show_bug.cgi?id=135250
- session.getBreakpointManager().update(currentTarget, miEvent);
- } catch (CDIException e) {
- }
- }
- } else if (miEvent instanceof MISharedLibChangedEvent) {
- cdiList.add(new ChangedEvent(session, (MISharedLibChangedEvent)miEvent));
- } else if (miEvent instanceof MISignalChangedEvent) {
- MISignalChangedEvent sig = (MISignalChangedEvent)miEvent;
- String name = sig.getName();
- if (name == null || name.length() == 0) {
- // Something change we do not know what
- // Let the signal manager handle it with an update().
- try {
- SignalManager sMgr = session.getSignalManager();
- sMgr.update(currentTarget);
- } catch (CDIException e) {
- }
- } else {
- cdiList.add(new ChangedEvent(session, sig));
- }
- }
- } else if (miEvent instanceof MIDestroyedEvent) {
- if (miEvent instanceof MIThreadExitEvent) {
- cdiList.add(new DestroyedEvent(session,(MIThreadExitEvent)miEvent));
- } else if (miEvent instanceof MIInferiorSignalExitEvent) {
- cdiList.add(new ExitedEvent(session, (MIInferiorSignalExitEvent)miEvent));
- } else if (miEvent instanceof MIInferiorExitEvent) {
- cdiList.add(new ExitedEvent(session, (MIInferiorExitEvent)miEvent));
- } else if (miEvent instanceof MIGDBExitEvent) {
- // Remove the target from the list.
- Target target = session.getTarget(miEvent.getMISession());
- if (target != null) {
- session.removeTargets(new Target[] { target });
- }
- cdiList.add(new ExitedEvent(session, (MIGDBExitEvent)miEvent));
- } else if (miEvent instanceof MIDetachedEvent) {
- cdiList.add(new DisconnectedEvent(session, (MIDetachedEvent)miEvent));
- } else if (miEvent instanceof MIBreakpointDeletedEvent) {
- MIBreakpointDeletedEvent bpoint = (MIBreakpointDeletedEvent)miEvent;
- if (bpoint.getNumber() > 0) {
- cdiList.add(new DestroyedEvent(session, bpoint));
- } else {
- // Something was deleted we do not know what
- // Let the breakpoint manager handle it with an update().
- try {
- session.getBreakpointManager().update(currentTarget);
- } catch (CDIException e) {
- }
- }
- } else if (miEvent instanceof MISharedLibUnloadedEvent) {
- processSharedLibUnloadedEvent((MISharedLibUnloadedEvent)miEvent);
- cdiList.add(new DestroyedEvent(session, (MISharedLibUnloadedEvent)miEvent));
- } else if (miEvent instanceof MIVarDeletedEvent) {
- cdiList.add(new DestroyedEvent(session, (MIVarDeletedEvent)miEvent));
- }
- } else if (miEvent instanceof MICreatedEvent) {
- if (miEvent instanceof MIBreakpointCreatedEvent) {
- MIBreakpointCreatedEvent bpoint = (MIBreakpointCreatedEvent)miEvent;
- if (bpoint.getNumber() > 0) {
- cdiList.add(new CreatedEvent(session, bpoint));
- } else {
- // Something created we do not know what
- // Let the breakpoint manager handle it with an update().
- try {
- session.getBreakpointManager().update(currentTarget);
- } catch (CDIException e) {
- }
- }
- } else if (miEvent instanceof MIVarCreatedEvent) {
- cdiList.add(new CreatedEvent(session, (MIVarCreatedEvent)miEvent));
- } else if (miEvent instanceof MIRegisterCreatedEvent) {
- cdiList.add(new CreatedEvent(session, (MIRegisterCreatedEvent)miEvent));
- } else if (miEvent instanceof MIThreadCreatedEvent) {
- cdiList.add(new CreatedEvent(session, (MIThreadCreatedEvent)miEvent));
- } else if (miEvent instanceof MIMemoryCreatedEvent) {
- cdiList.add(new CreatedEvent(session, (MIMemoryCreatedEvent)miEvent));
- } else if (miEvent instanceof MISharedLibCreatedEvent) {
- cdiList.add(new CreatedEvent(session, (MISharedLibCreatedEvent)miEvent));
- } else if (miEvent instanceof MIInferiorCreatedEvent) {
- cdiList.add(new CreatedEvent(session, (MIInferiorCreatedEvent)miEvent));
- }
- }
-
- // Fire the event;
- ICDIEvent[] cdiEvents = (ICDIEvent[])cdiList.toArray(new ICDIEvent[0]);
- fireEvents(cdiEvents);
- }
-
- public EventManager(Session session) {
- super(session);
- }
-
- /**
- * @see org.eclipse.cdt.debug.core.cdi.ICDIEventManager#addEventListener(ICDIEventListener)
- */
- @Override
- public void addEventListener(ICDIEventListener listener) {
- list.add(listener);
- }
-
- /**
- * @see org.eclipse.cdt.debug.core.cdi.ICDIEventManager#removeEventListener(ICDIEventListener)
- */
- @Override
- public void removeEventListener(ICDIEventListener listener) {
- list.remove(listener);
- }
-
- public void removeEventListeners() {
- list.clear();
- }
-
- /**
- * Send ICDIEvent to the listeners.
- */
- 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++) {
- listeners[i].handleDebugEvents(cdiEvents);
- }
- }
- }
-
- /**
- * When suspended arrives, reset managers and target.
- * Alse the variable and the memory needs to be updated and events
- * fired for changes.
- */
- boolean processSuspendedEvent(MIStoppedEvent stopped) {
- Session session = (Session)getSession();
- MISession miSession = stopped.getMISession();
- Target currentTarget = session.getTarget(miSession);
- currentTarget.setSupended(true);
-
- // Bailout early if we do not want to process any events.
- if (!isAllowingProcessingEvents()) {
- return false;
- }
-
-
- if (processSharedLibEvent(stopped)) {
- // Event was consumed by the shared lib processing bailout
- return false;
- }
-
- if (processBreakpointHitEvent(stopped)) {
- // Event was consumed, i.e. it was not the right exception.
- return false;
- }
-
- int threadId = stopped.getThreadId();
- currentTarget.updateState(threadId);
- try {
- Thread cthread = (Thread)currentTarget.getCurrentThread();
- if (cthread != null) {
- cthread.getCurrentStackFrame();
- } else {
- return true;
- }
- } catch (CDIException e1) {
- //e1.printStackTrace();
- return true;
- }
-
- // Update the managers.
- // For the Variable/Expression Managers call only the updateManager.
- VariableManager varMgr = session.getVariableManager();
- ExpressionManager expMgr = session.getExpressionManager();
- RegisterManager regMgr = session.getRegisterManager();
- MemoryManager memMgr = session.getMemoryManager();
- BreakpointManager bpMgr = session.getBreakpointManager();
- SignalManager sigMgr = session.getSignalManager();
- SourceManager srcMgr = session.getSourceManager();
- SharedLibraryManager libMgr = session.getSharedLibraryManager();
- try {
- if (varMgr.isAutoUpdate()) {
- varMgr.update(currentTarget);
- }
- if (expMgr.isAutoUpdate()) {
- expMgr.update(currentTarget);
- }
- if (regMgr.isAutoUpdate()) {
- regMgr.update(currentTarget);
- }
- if (memMgr.isAutoUpdate()) {
- memMgr.update(currentTarget);
- }
- if (bpMgr.isAutoUpdate()) {
- bpMgr.update(currentTarget);
- }
- if (sigMgr.isAutoUpdate()) {
- sigMgr.update(currentTarget);
- }
- if (libMgr.isAutoUpdate()) {
- libMgr.update(currentTarget);
- }
- if (srcMgr.isAutoUpdate()) {
- srcMgr.update(currentTarget);
- }
- } catch (CDIException e) {
- // Something went wrong => preventing updates to the model, this is serious
- MIPlugin.log(e);
- }
- return true;
- }
-
- /**
- * When a shared library is unloading we could possibly have stale libraries.
- * GDB does no react well to this: see PR
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=74496
- * @param unLoaded
- * @return
- */
- boolean processSharedLibUnloadedEvent(MISharedLibUnloadedEvent unLoaded) {
- Session session = (Session)getSession();
- MISession miSession = unLoaded.getMISession();
- Target target = session.getTarget(miSession);
-
- // We do not need to do fancy checking we can just delete all
- // the expression variable and let UI recreate them by reevaluating.
- ExpressionManager expMgr = session.getExpressionManager();
- try {
- expMgr.deleteAllVariables(target);
- } catch (CDIException e) {
- }
-
- return false;
- }
-
- /**
- * If the deferredBreakpoint processing is set
- * catch the shared-lib-event go to the last known
- * stackframe and try to finish.
- * Save the last user command and issue it again.
- * @param stopped
- * @return
- */
- boolean processSharedLibEvent(MIStoppedEvent stopped) {
- Session session = (Session)getSession();
- MISession miSession = stopped.getMISession();
-
- Target currentTarget = session.getTarget(miSession);
- SharedLibraryManager mgr = session.getSharedLibraryManager();
-
- if (mgr.isDeferredBreakpoint(currentTarget)) {
- if (stopped instanceof MISharedLibEvent) {
- // Check if we have a new library loaded
- try {
- mgr.update(currentTarget);
- } catch (CDIException e3) {
- }
- CommandFactory factory = miSession.getCommandFactory();
- int type = (lastRunningEvent == null) ? MIRunningEvent.CONTINUE : lastRunningEvent.getType();
- if (lastUserCommand == null) {
- switch (type) {
- case MIRunningEvent.NEXT:
- lastUserCommand = factory.createMIExecNext(1);
- break;
- case MIRunningEvent.NEXTI:
- lastUserCommand = factory.createMIExecNextInstruction(1);
- break;
- case MIRunningEvent.STEP:
- lastUserCommand = factory.createMIExecStep(1);
- break;
- case MIRunningEvent.STEPI:
- lastUserCommand = factory.createMIExecStepInstruction(1);
- break;
- case MIRunningEvent.FINISH:
- lastUserCommand = factory.createMIExecFinish();
- break;
- case MIRunningEvent.RETURN:
- lastUserCommand = factory.createMIExecReturn();
- break;
- case MIRunningEvent.CONTINUE: {
- MIExecContinue cont = factory.createMIExecContinue();
- cont.setQuiet(true);
- try {
- miSession.postCommand(cont);
- MIInfo info = cont.getMIInfo();
- if (info == null) {
- // throw new CDIException("Target is not responding");
- }
- } catch (MIException e) {
- // throw new MI2CDIException(e);
- }
- return true; // for the continue bailout early no need to the stuff below
- }
- }
- }
-
- int miLevel = 0;
- int tid = 0;
- Thread currentThread = null;
- try {
- currentThread = (Thread)currentTarget.getCurrentThread();
- } catch (CDIException e1) {
- }
- tid = currentThread.getId();
- // Select the old thread now.
- if (tid > 0) {
- MIThreadSelect selectThread = factory.createMIThreadSelect(tid);
- try {
- miSession.postCommand(selectThread);
- } catch (MIException e) {
- // ignore
- }
- }
- ICDIStackFrame frame = null;
- try {
- frame = currentThread.getCurrentStackFrame();
- } catch (CDIException e2) {
- }
- int count = 0;
- try {
- MIStackInfoDepth depth = factory.createMIStackInfoDepth();
- miSession.postCommand(depth);
- MIStackInfoDepthInfo info = depth.getMIStackInfoDepthInfo();
- if (info == null) {
- //throw new CDIException("No answer");
- }
- count = info.getDepth();
- } catch (MIException e) {
- //throw new MI2CDIException(e);
- //System.out.println(e);
- }
- if (frame != null) {
- // Fortunately the ICDIStackFrame store the level
- // in ascending level the higher the stack the higher the level
- // GDB does the opposite the highest stack is 0.
- // This allow us to do some calculation, in figure out the
- // level of the old stack. The -1 is because gdb level is zero-based
- miLevel = count - frame.getLevel() - 1;
- }
- if (miLevel >= 0) {
- MIStackSelectFrame selectFrame = factory.createMIStackSelectFrame(miLevel);
- MIExecFinish finish = factory.createMIExecFinish();
- finish.setQuiet(true);
- try {
- miSession.postCommand(selectFrame);
- miSession.postCommand(finish);
- } catch (MIException e) {
- // ignore
- }
- } else {
- // if we are still at the same level in the backtrace
- // for example the StopEventLib was on a different thread
- // redo the last command.
- Command cmd = lastUserCommand;
- cmd.setQuiet(true);
- lastUserCommand = null;
- try {
- miSession.postCommand(cmd);
- } catch (MIException e) {
- // ignore
- }
- }
- return true;
- } else if (lastUserCommand != null) {
- Command cmd = lastUserCommand;
- cmd.setQuiet(true);
- lastUserCommand = null;
- try {
- miSession.postCommand(cmd);
- } catch (MIException e) {
- }
- return true;
- }
- }
- return false;
- }
-
- boolean processBreakpointHitEvent(MIStoppedEvent stopped) {
-// Session session = (Session)getSession();
-// if (stopped instanceof MIBreakpointHitEvent) {
-// MIBreakpointHitEvent bpEvent = (MIBreakpointHitEvent)stopped;
-// BreakpointManager bpMgr = session.getBreakpointManager();
-// int bpNo = bpEvent.getNumber();
-// }
- return false;
- }
-
- /**
- * Do any processing of before a running event.
- */
- boolean processRunningEvent(MIRunningEvent running) {
- lastRunningEvent = running;
-
- Session session = (Session)getSession();
- MISession miSession = running.getMISession();
- Target currentTarget = session.getTarget(miSession);
- currentTarget.setSupended(false);
-
- // Bailout early if we do not want to process any events.
- if (!isAllowingProcessingEvents() || !running.propagate()) {
- return false;
- }
-
- return true;
- }
-
- public boolean isAllowingProcessingEvents() {
- return fAllowProcessingEvents;
- }
-
- public void allowProcessingEvents(boolean allowed) {
- fAllowProcessingEvents = allowed;
- }
-}

Back to the top