mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Bug 399419 - [visualizer] Minimize visualizer model (re-)creation
Change-Id: I74bddda8a2eb814c04b93089d10bbb0683e747f5 Reviewed-on: https://git.eclipse.org/r/11601 IP-Clean: Marc Khouzam <marc.khouzam@ericsson.com> Tested-by: Marc Khouzam <marc.khouzam@ericsson.com> Reviewed-by: William Swanson <traveler@tilera.com> Reviewed-by: Marc Khouzam <marc.khouzam@ericsson.com>
This commit is contained in:
parent
482e736a08
commit
76b5dde840
3 changed files with 105 additions and 44 deletions
|
@ -10,6 +10,7 @@
|
||||||
* IBM Corporation
|
* IBM Corporation
|
||||||
* Marc Dumais (Ericsson) - Bug 399281
|
* Marc Dumais (Ericsson) - Bug 399281
|
||||||
* Marc Dumais (Ericsson) - Add CPU/core load information to the multicore visualizer (Bug 396268)
|
* Marc Dumais (Ericsson) - Add CPU/core load information to the multicore visualizer (Bug 396268)
|
||||||
|
* Marc Dumais (Ericsson) - Bug 399419
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
||||||
|
@ -665,7 +666,8 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer
|
||||||
{
|
{
|
||||||
// Execute a refresh after any pending UI updates.
|
// Execute a refresh after any pending UI updates.
|
||||||
GUIUtils.exec( new Runnable() { @Override public void run() {
|
GUIUtils.exec( new Runnable() { @Override public void run() {
|
||||||
MulticoreVisualizer.this.refresh();
|
// check if we need to update the debug context
|
||||||
|
updateDebugContext();
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -692,8 +694,20 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer
|
||||||
@Override
|
@Override
|
||||||
public void workbenchSelectionChanged(ISelection selection)
|
public void workbenchSelectionChanged(ISelection selection)
|
||||||
{
|
{
|
||||||
refresh();
|
// See if we need to update our debug info from
|
||||||
|
// the workbench selection. This will be done asynchronously.
|
||||||
|
boolean changed = updateDebugContext();
|
||||||
|
|
||||||
|
if (changed) {
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Even if debug info doesn't change, we still want to
|
||||||
|
// check whether the canvas selection needs to change
|
||||||
|
// to reflect the current workbench selection.
|
||||||
|
updateCanvasSelection();
|
||||||
|
}
|
||||||
|
|
||||||
// Also check whether we need to attach debug view listener.
|
// Also check whether we need to attach debug view listener.
|
||||||
updateDebugViewListener();
|
updateDebugViewListener();
|
||||||
}
|
}
|
||||||
|
@ -701,14 +715,8 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer
|
||||||
/** Refreshes visualizer content from model. */
|
/** Refreshes visualizer content from model. */
|
||||||
public void refresh()
|
public void refresh()
|
||||||
{
|
{
|
||||||
// See if we need to update our debug info from
|
m_canvas.requestRecache();
|
||||||
// the workbench selection. This will be done asynchronously.
|
m_canvas.requestUpdate();
|
||||||
boolean changed = updateDebugContext();
|
|
||||||
|
|
||||||
// Even if debug info doesn't change, we still want to
|
|
||||||
// check whether the canvas selection needs to change
|
|
||||||
// to reflect the current workbench selection.
|
|
||||||
if (!changed) updateCanvasSelection();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -829,7 +837,7 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer
|
||||||
* Returns true if canvas context actually changes, false if not.
|
* Returns true if canvas context actually changes, false if not.
|
||||||
*/
|
*/
|
||||||
public boolean setDebugSession(String sessionId) {
|
public boolean setDebugSession(String sessionId) {
|
||||||
boolean changed = true;
|
boolean changed = false;
|
||||||
|
|
||||||
if (m_sessionState != null &&
|
if (m_sessionState != null &&
|
||||||
! m_sessionState.getSessionID().equals(sessionId))
|
! m_sessionState.getSessionID().equals(sessionId))
|
||||||
|
@ -854,8 +862,6 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer
|
||||||
initializeLoadMeterTimer();
|
initializeLoadMeterTimer();
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed) update();
|
|
||||||
|
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
@ -1102,7 +1108,12 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer
|
||||||
// If we can't get the real Linux OS tid, fallback to using the gdb thread id
|
// If we can't get the real Linux OS tid, fallback to using the gdb thread id
|
||||||
int osTid = (osTIDValue == null) ? tid : Integer.parseInt(osTIDValue);
|
int osTid = (osTIDValue == null) ? tid : Integer.parseInt(osTIDValue);
|
||||||
|
|
||||||
model.addThread(new VisualizerThread(core, pid, osTid, tid, state));
|
// add thread if not already there - there is a potential race condition where a
|
||||||
|
// thread can be added twice to the model: once at model creation and once more
|
||||||
|
// through the listener. Checking at both places to prevent this.
|
||||||
|
if (model.getThread(tid) == null) {
|
||||||
|
model.addThread(new VisualizerThread(core, pid, osTid, tid, state));
|
||||||
|
}
|
||||||
|
|
||||||
// keep track of threads visited
|
// keep track of threads visited
|
||||||
done(1, model);
|
done(1, model);
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
* Marc Dumais (Ericsson) - Bug 396293
|
* Marc Dumais (Ericsson) - Bug 396293
|
||||||
* Marc Dumais (Ericsson) - Bug 399281
|
* Marc Dumais (Ericsson) - Bug 399281
|
||||||
* Marc Dumais (Ericsson) - Add CPU/core load information to the multicore visualizer (Bug 396268)
|
* Marc Dumais (Ericsson) - Add CPU/core load information to the multicore visualizer (Bug 396268)
|
||||||
|
* Marc Dumais (Ericsson) - Bug 399419
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
||||||
|
@ -970,13 +971,14 @@ public class MulticoreVisualizerCanvas extends GraphicCanvas
|
||||||
@Override
|
@Override
|
||||||
public void setSelection(ISelection selection)
|
public void setSelection(ISelection selection)
|
||||||
{
|
{
|
||||||
m_selectionManager.setSelection(selection);
|
setSelection(selection, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets externally-visible selection. */
|
/** Sets externally-visible selection. */
|
||||||
public void setSelection(ISelection selection, boolean raiseEvent)
|
public void setSelection(ISelection selection, boolean raiseEvent)
|
||||||
{
|
{
|
||||||
m_selectionManager.setSelection(selection, raiseEvent);
|
m_selectionManager.setSelection(selection, raiseEvent);
|
||||||
|
requestUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets whether selection events are enabled. */
|
/** Sets whether selection events are enabled. */
|
||||||
|
|
|
@ -8,12 +8,14 @@
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Marc Khouzam (Ericsson) - initial API and implementation
|
* Marc Khouzam (Ericsson) - initial API and implementation
|
||||||
* Marc Dumais (Ericsson) - Bug 400231
|
* Marc Dumais (Ericsson) - Bug 400231
|
||||||
|
* Marc Dumais (Ericsson) - Bug 399419
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
||||||
|
|
||||||
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
||||||
|
import org.eclipse.cdt.dsf.datamodel.DataModelInitializedEvent;
|
||||||
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IProcesses;
|
import org.eclipse.cdt.dsf.debug.service.IProcesses;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
|
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
|
||||||
|
@ -61,39 +63,72 @@ public class MulticoreVisualizerEventListener {
|
||||||
|
|
||||||
// --- event handlers ---
|
// --- event handlers ---
|
||||||
|
|
||||||
/** Invoked when a thread or process is suspended. */
|
/**
|
||||||
|
* Invoked when a thread or process is suspended.
|
||||||
|
* Updates both state of the thread and the core it's running on
|
||||||
|
*/
|
||||||
@DsfServiceEventHandler
|
@DsfServiceEventHandler
|
||||||
public void handleEvent(ISuspendedDMEvent event) {
|
public void handleEvent(final ISuspendedDMEvent event) {
|
||||||
IDMContext context = event.getDMContext();
|
IDMContext context = event.getDMContext();
|
||||||
if (context instanceof IContainerDMContext) {
|
if (context instanceof IContainerDMContext) {
|
||||||
// We don't deal with processes
|
// We don't deal with processes
|
||||||
} else if (context instanceof IMIExecutionDMContext) {
|
} else if (context instanceof IMIExecutionDMContext) {
|
||||||
// Thread suspended
|
// Thread suspended
|
||||||
int tid = ((IMIExecutionDMContext)context).getThreadId();
|
|
||||||
|
|
||||||
VisualizerThread thread = fVisualizer.getModel().getThread(tid);
|
|
||||||
|
|
||||||
if (thread != null) {
|
final IMIExecutionDMContext execDmc = (IMIExecutionDMContext)context;
|
||||||
assert thread.getState() == VisualizerExecutionState.RUNNING;
|
IThreadDMContext threadContext =
|
||||||
|
DMContexts.getAncestorOfType(execDmc, IThreadDMContext.class);
|
||||||
VisualizerExecutionState newState = VisualizerExecutionState.SUSPENDED;
|
|
||||||
|
|
||||||
if (event.getReason() == StateChangeReason.SIGNAL) {
|
DsfServicesTracker tracker =
|
||||||
if (event instanceof IMIDMEvent) {
|
new DsfServicesTracker(MulticoreVisualizerUIPlugin.getBundleContext(),
|
||||||
Object miEvent = ((IMIDMEvent)event).getMIEvent();
|
execDmc.getSessionId());
|
||||||
if (miEvent instanceof MISignalEvent) {
|
IProcesses procService = tracker.getService(IProcesses.class);
|
||||||
String signalName = ((MISignalEvent)miEvent).getName();
|
tracker.dispose();
|
||||||
if (DSFDebugModel.isCrashSignal(signalName)) {
|
|
||||||
newState = VisualizerExecutionState.CRASHED;
|
procService.getExecutionData(threadContext,
|
||||||
}
|
new ImmediateDataRequestMonitor<IThreadDMData>() {
|
||||||
|
@Override
|
||||||
}
|
protected void handleSuccess() {
|
||||||
}
|
IThreadDMData data = getData();
|
||||||
}
|
|
||||||
|
// Check whether we know about cores
|
||||||
|
if (data instanceof IGdbThreadDMData) {
|
||||||
|
String[] cores = ((IGdbThreadDMData)data).getCores();
|
||||||
|
if (cores != null) {
|
||||||
|
assert cores.length == 1; // A thread belongs to a single core
|
||||||
|
int coreId = Integer.parseInt(cores[0]);
|
||||||
|
VisualizerCore vCore = fVisualizer.getModel().getCore(coreId);
|
||||||
|
|
||||||
|
int tid = execDmc.getThreadId();
|
||||||
|
|
||||||
|
VisualizerThread thread = fVisualizer.getModel().getThread(tid);
|
||||||
|
|
||||||
|
if (thread != null) {
|
||||||
|
assert thread.getState() == VisualizerExecutionState.RUNNING;
|
||||||
|
|
||||||
|
VisualizerExecutionState newState = VisualizerExecutionState.SUSPENDED;
|
||||||
|
|
||||||
thread.setState(newState);
|
if (event.getReason() == StateChangeReason.SIGNAL) {
|
||||||
fVisualizer.getMulticoreVisualizerCanvas().requestUpdate();
|
if (event instanceof IMIDMEvent) {
|
||||||
}
|
Object miEvent = ((IMIDMEvent)event).getMIEvent();
|
||||||
|
if (miEvent instanceof MISignalEvent) {
|
||||||
|
String signalName = ((MISignalEvent)miEvent).getName();
|
||||||
|
if (DSFDebugModel.isCrashSignal(signalName)) {
|
||||||
|
newState = VisualizerExecutionState.CRASHED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
thread.setState(newState);
|
||||||
|
thread.setCore(vCore);
|
||||||
|
fVisualizer.getMulticoreVisualizerCanvas().requestUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,9 +200,13 @@ public class MulticoreVisualizerEventListener {
|
||||||
// That is ok, we'll be refreshing right away at startup
|
// That is ok, we'll be refreshing right away at startup
|
||||||
}
|
}
|
||||||
|
|
||||||
fVisualizer.getModel().addThread(new VisualizerThread(vCore, pid, osTid, tid, VisualizerExecutionState.RUNNING));
|
// add thread if not already there - there is a potential race condition where a
|
||||||
|
// thread can be added twice to the model: once at model creation and once more
|
||||||
fVisualizer.getMulticoreVisualizerCanvas().requestUpdate();
|
// through the listener. Checking at both places to prevent this.
|
||||||
|
if (fVisualizer.getModel().getThread(tid) == null ) {
|
||||||
|
fVisualizer.getModel().addThread(new VisualizerThread(vCore, pid, osTid, tid, VisualizerExecutionState.RUNNING));
|
||||||
|
fVisualizer.getMulticoreVisualizerCanvas().requestUpdate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -193,6 +232,15 @@ public class MulticoreVisualizerEventListener {
|
||||||
canvas.requestUpdate();
|
canvas.requestUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Invoked when the debug data model is ready */
|
||||||
|
@DsfServiceEventHandler
|
||||||
|
public void handleEvent(DataModelInitializedEvent event) {
|
||||||
|
// re-create the visualizer model now that CPU and core info is available
|
||||||
|
fVisualizer.update();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue