mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Process MIMemoryChangedEvents.
This commit is contained in:
parent
5bd17656da
commit
6211cfdea3
1 changed files with 40 additions and 11 deletions
|
@ -23,6 +23,7 @@ import org.eclipse.cdt.debug.mi.core.event.MIFunctionFinishedEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.event.MIGDBExitEvent;
|
import org.eclipse.cdt.debug.mi.core.event.MIGDBExitEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.event.MIInferiorExitEvent;
|
import org.eclipse.cdt.debug.mi.core.event.MIInferiorExitEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.event.MILocationReachedEvent;
|
import org.eclipse.cdt.debug.mi.core.event.MILocationReachedEvent;
|
||||||
|
import org.eclipse.cdt.debug.mi.core.event.MIMemoryChangedEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.event.MIRegisterChangedEvent;
|
import org.eclipse.cdt.debug.mi.core.event.MIRegisterChangedEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.event.MIRunningEvent;
|
import org.eclipse.cdt.debug.mi.core.event.MIRunningEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.event.MISignalEvent;
|
import org.eclipse.cdt.debug.mi.core.event.MISignalEvent;
|
||||||
|
@ -46,37 +47,52 @@ public class EventManager extends SessionObject implements ICDIEventManager, Obs
|
||||||
public void update(Observable o, Object arg) {
|
public void update(Observable o, Object arg) {
|
||||||
MIEvent miEvent = (MIEvent)arg;
|
MIEvent miEvent = (MIEvent)arg;
|
||||||
CSession session = getCSession();
|
CSession session = getCSession();
|
||||||
ICDIEvent cdiEvent = null;
|
List cdiList = new ArrayList(1);
|
||||||
|
|
||||||
if (miEvent instanceof MIStoppedEvent) {
|
if (miEvent instanceof MIStoppedEvent) {
|
||||||
processSuspendedEvent(miEvent);
|
processSuspendedEvent(miEvent);
|
||||||
cdiEvent = new SuspendedEvent(session, miEvent);
|
cdiList.add(new SuspendedEvent(session, miEvent));
|
||||||
} else if (miEvent instanceof MIRunningEvent) {
|
} else if (miEvent instanceof MIRunningEvent) {
|
||||||
cdiEvent = new ResumedEvent(session, (MIRunningEvent)miEvent);
|
cdiList.add(new ResumedEvent(session, (MIRunningEvent)miEvent));
|
||||||
} else if (miEvent instanceof MIChangedEvent) {
|
} else if (miEvent instanceof MIChangedEvent) {
|
||||||
if (miEvent instanceof MIVarChangedEvent) {
|
if (miEvent instanceof MIVarChangedEvent) {
|
||||||
MIVarChangedEvent eventChanged = (MIVarChangedEvent)miEvent;
|
MIVarChangedEvent eventChanged = (MIVarChangedEvent)miEvent;
|
||||||
|
// We will receive a MIVarChangeEvent if the variable is
|
||||||
|
// no longer in scope in this case fire up a DestroyEvent
|
||||||
if (eventChanged.isInScope()) {
|
if (eventChanged.isInScope()) {
|
||||||
cdiEvent = new ChangedEvent(session, (MIVarChangedEvent)miEvent);
|
cdiList.add(new ChangedEvent(session, eventChanged));
|
||||||
} else {
|
} else {
|
||||||
cdiEvent = new DestroyedEvent(session, (MIVarChangedEvent)miEvent);
|
cdiList.add(new DestroyedEvent(session, eventChanged));
|
||||||
}
|
}
|
||||||
} else if (miEvent instanceof MIRegisterChangedEvent) {
|
} else if (miEvent instanceof MIRegisterChangedEvent) {
|
||||||
cdiEvent = new ChangedEvent(session, (MIRegisterChangedEvent)miEvent);
|
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 = (MemoryManager)session.getMemoryManager();
|
||||||
|
MemoryBlock[] blocks = mgr.listMemoryBlocks();
|
||||||
|
MIMemoryChangedEvent miMem = (MIMemoryChangedEvent)miEvent;
|
||||||
|
Long[] addresses = miMem.getAddresses();
|
||||||
|
for (int i = 0; i < blocks.length; i++) {
|
||||||
|
if (blocks[i].contains(addresses)) {
|
||||||
|
cdiList.add(new MemoryChangedEvent(session, blocks[i], miMem));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (miEvent instanceof MIThreadExitEvent) {
|
} else if (miEvent instanceof MIThreadExitEvent) {
|
||||||
cdiEvent = new DestroyedEvent(session,(MIThreadExitEvent)miEvent);
|
cdiList.add(new DestroyedEvent(session,(MIThreadExitEvent)miEvent));
|
||||||
} else if (miEvent instanceof MIInferiorExitEvent) {
|
} else if (miEvent instanceof MIInferiorExitEvent) {
|
||||||
cdiEvent = new ExitedEvent(session, (MIInferiorExitEvent)miEvent);
|
cdiList.add(new ExitedEvent(session, (MIInferiorExitEvent)miEvent));
|
||||||
} else if (miEvent instanceof MIGDBExitEvent) {
|
} else if (miEvent instanceof MIGDBExitEvent) {
|
||||||
cdiEvent = new DestroyedEvent(session);
|
cdiList.add(new DestroyedEvent(session));
|
||||||
} else if (miEvent instanceof MIDetachedEvent) {
|
} else if (miEvent instanceof MIDetachedEvent) {
|
||||||
cdiEvent = new DisconnectedEvent(session);
|
cdiList.add(new DisconnectedEvent(session));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fire the event;
|
// Fire the event;
|
||||||
if (isEnable) {
|
if (isEnable) {
|
||||||
fireEvent(cdiEvent);
|
ICDIEvent[] cdiEvents = (ICDIEvent[])cdiList.toArray(new ICDIEvent[0]);
|
||||||
|
fireEvent(cdiEvents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,6 +114,14 @@ public class EventManager extends SessionObject implements ICDIEventManager, Obs
|
||||||
list.remove(listener);
|
list.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void fireEvent(ICDIEvent[] cdiEvents) {
|
||||||
|
if (cdiEvents != null) {
|
||||||
|
for (int i = 0; i < cdiEvents.length; i++) {
|
||||||
|
fireEvent(cdiEvents[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void fireEvent(ICDIEvent cdiEvent) {
|
private void fireEvent(ICDIEvent cdiEvent) {
|
||||||
if (cdiEvent != null) {
|
if (cdiEvent != null) {
|
||||||
ICDIEventListener[] listeners =
|
ICDIEventListener[] listeners =
|
||||||
|
@ -110,6 +134,8 @@ public class EventManager extends SessionObject implements ICDIEventManager, Obs
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When suspended arrives, reset managers and target.
|
* When suspended arrives, reset managers and target.
|
||||||
|
* Alse the variable and the memory needs to be updated and events
|
||||||
|
* fired for changes.
|
||||||
*/
|
*/
|
||||||
void processSuspendedEvent(MIEvent event) {
|
void processSuspendedEvent(MIEvent event) {
|
||||||
int threadId = 0;
|
int threadId = 0;
|
||||||
|
@ -139,11 +165,14 @@ public class EventManager extends SessionObject implements ICDIEventManager, Obs
|
||||||
}
|
}
|
||||||
target.updateState(threadId);
|
target.updateState(threadId);
|
||||||
|
|
||||||
|
// Update the managers.
|
||||||
VariableManager varMgr = getCSession().getVariableManager();
|
VariableManager varMgr = getCSession().getVariableManager();
|
||||||
RegisterManager regMgr = getCSession().getRegisterManager();
|
RegisterManager regMgr = getCSession().getRegisterManager();
|
||||||
|
MemoryManager memMgr = (MemoryManager)getCSession().getMemoryManager();
|
||||||
try {
|
try {
|
||||||
varMgr.update();
|
varMgr.update();
|
||||||
regMgr.update();
|
regMgr.update();
|
||||||
|
memMgr.update();
|
||||||
} catch (CDIException e) {
|
} catch (CDIException e) {
|
||||||
//System.out.println(e);
|
//System.out.println(e);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue