mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-19 15:05:36 +02:00
Bug 431935 - Add tooltips in Thread object of multicore visualizer
Change-Id: I18c4f4de4740c8c0286b78e5b079fc55b159f78d Signed-off-by: Xavier Raynaud <xavier.raynaud@kalray.eu> Reviewed-on: https://git.eclipse.org/r/24522 Reviewed-by: Marc Dumais <marc.dumais@ericsson.com> Tested-by: Marc Dumais <marc.dumais@ericsson.com>
This commit is contained in:
parent
882369b295
commit
62e660108a
9 changed files with 240 additions and 31 deletions
|
@ -14,7 +14,8 @@ Require-Bundle: org.eclipse.ui,
|
|||
org.eclipse.cdt.ui,
|
||||
org.eclipse.cdt.visualizer.core,
|
||||
org.eclipse.cdt.visualizer.ui,
|
||||
org.eclipse.debug.ui
|
||||
org.eclipse.debug.ui,
|
||||
org.eclipse.cdt.core
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
||||
Import-Package: com.ibm.icu.text
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012, 2013 Tilera Corporation and others.
|
||||
* Copyright (c) 2012, 2014 Tilera Corporation 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
|
||||
|
@ -9,6 +9,7 @@
|
|||
* William R. Swanson (Tilera Corporation) - initial API and implementation
|
||||
* Marc Dumais (Ericsson) - Bug 405390
|
||||
* Marc Dumais (Ericsson) - Bug 407321
|
||||
* Xavier Raynaud (Kalray) - Add tooltip support (Bug 431935)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.model;
|
||||
|
@ -269,6 +270,7 @@ public class VisualizerModel
|
|||
if (m_keepExitedThreads) {
|
||||
VisualizerThread thread = getThread(threadId);
|
||||
thread.setState(VisualizerExecutionState.EXITED);
|
||||
thread.setLocationInfo((String) null);
|
||||
} else {
|
||||
removeThread(threadId);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012, 2013 Tilera Corporation and others.
|
||||
* Copyright (c) 2012, 2014 Tilera Corporation 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
|
||||
|
@ -11,10 +11,13 @@
|
|||
* state and os/gdb thread ids
|
||||
* Marc Dumais (Ericsson) - Bug 405390
|
||||
* Marc Dumais (Ericsson) - Bug 409965
|
||||
* Xavier Raynaud (Kalray) - Add tooltip support (Bug 431935)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.model;
|
||||
|
||||
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
|
||||
|
||||
|
||||
/** Represents single thread. */
|
||||
public class VisualizerThread
|
||||
|
@ -37,16 +40,25 @@ public class VisualizerThread
|
|||
/** Thread execution state. */
|
||||
protected VisualizerExecutionState m_threadState;
|
||||
|
||||
/** Location of this Thread, if any, based on his MIFrame */
|
||||
private String m_locInfo;
|
||||
|
||||
|
||||
// --- constructors/destructors ---
|
||||
|
||||
/** Constructor. */
|
||||
public VisualizerThread(VisualizerCore core, int pid, int tid, int gdbtid, VisualizerExecutionState state) {
|
||||
this(core, pid, tid, gdbtid, state, null);
|
||||
}
|
||||
|
||||
/** Constructor. */
|
||||
public VisualizerThread(VisualizerCore core, int pid, int tid, int gdbtid, VisualizerExecutionState state, IFrameDMData frame) {
|
||||
m_core = core;
|
||||
m_pid = pid;
|
||||
m_tid = tid;
|
||||
m_gdbtid = gdbtid;
|
||||
m_threadState = state;
|
||||
setLocationInfo(frame);
|
||||
}
|
||||
|
||||
/** Dispose method */
|
||||
|
@ -186,4 +198,80 @@ public class VisualizerThread
|
|||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the location info of this thread
|
||||
* @param s a string, displayinf location information of this thread.
|
||||
*/
|
||||
public void setLocationInfo(String s) {
|
||||
this.m_locInfo = s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the location info of this thread, based on given
|
||||
* {@link IFrameDMData}
|
||||
*
|
||||
* @param dmData
|
||||
* a {@link IFrameDMData} (can be <code>null</code>)
|
||||
*/
|
||||
public void setLocationInfo(IFrameDMData dmData) {
|
||||
if (dmData == null) {
|
||||
this.m_locInfo = null;
|
||||
} else {
|
||||
StringBuilder label = new StringBuilder();
|
||||
// Add the function name
|
||||
if (dmData.getFunction() != null
|
||||
&& dmData.getFunction().length() != 0) {
|
||||
label.append(" "); //$NON-NLS-1$
|
||||
label.append(dmData.getFunction());
|
||||
label.append("()"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
boolean hasFileName = dmData.getFile() != null
|
||||
&& dmData.getFile().length() != 0;
|
||||
|
||||
// Add full file name
|
||||
if (hasFileName) {
|
||||
label.append(" at "); //$NON-NLS-1$
|
||||
label.append(dmData.getFile());
|
||||
|
||||
// Add line number
|
||||
if (dmData.getLine() >= 0) {
|
||||
label.append(":"); //$NON-NLS-1$
|
||||
label.append(dmData.getLine());
|
||||
label.append(" "); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
// Add module
|
||||
if (!hasFileName
|
||||
&& (dmData.getModule() != null && dmData.getModule()
|
||||
.length() != 0)) {
|
||||
label.append(" "); //$NON-NLS-1$
|
||||
label.append(dmData.getModule());
|
||||
label.append(" "); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
// Add the address
|
||||
if (dmData.getAddress() != null) {
|
||||
label.append("- 0x" + dmData.getAddress().toString(16)); //$NON-NLS-1$
|
||||
}
|
||||
this.m_locInfo = label.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the location of this thread or <code>null</code> if none.
|
||||
*
|
||||
* @return a String, or <code>null</code>
|
||||
* @since 3.0
|
||||
*/
|
||||
public String getLocationInfo() {
|
||||
if (m_threadState == VisualizerExecutionState.RUNNING
|
||||
|| m_threadState == VisualizerExecutionState.EXITED) {
|
||||
return null;
|
||||
}
|
||||
return m_locInfo;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012, 2013 Tilera Corporation and others.
|
||||
* Copyright (c) 2012, 2014 Tilera Corporation 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
|
||||
|
@ -16,6 +16,7 @@
|
|||
* Marc Dumais (Ericsson) - Bug 407321
|
||||
* Marc-Andre Laperle (Ericsson) - Bug 411634
|
||||
* Marc Dumais (Ericsson) - Bug 409965
|
||||
* Xavier Raynaud (kalray) - Bug 431935
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
||||
|
@ -30,6 +31,7 @@ import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
|
|||
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
||||
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
||||
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData;
|
||||
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
|
||||
import org.eclipse.cdt.dsf.gdb.launching.GDBProcess;
|
||||
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
|
||||
import org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.MulticoreVisualizerUIPlugin;
|
||||
|
@ -1118,7 +1120,6 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer
|
|||
for (IDMContext threadContext : threadContexts) {
|
||||
IMIExecutionDMContext execContext =
|
||||
DMContexts.getAncestorOfType(threadContext, IMIExecutionDMContext.class);
|
||||
|
||||
// Don't add the thread to the model just yet, let's wait until we have its data and execution state.
|
||||
// Collect thread data
|
||||
DSFDebugModel.getThreadData(m_sessionState, cpuContext, coreContext, execContext, this, model);
|
||||
|
@ -1153,6 +1154,7 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer
|
|||
ICoreDMContext coreContext,
|
||||
IMIExecutionDMContext execContext,
|
||||
IThreadDMData threadData,
|
||||
IFrameDMData frame,
|
||||
VisualizerExecutionState state,
|
||||
Object arg)
|
||||
{
|
||||
|
@ -1181,15 +1183,15 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer
|
|||
// through the listener. Checking at both places to prevent this.
|
||||
VisualizerThread t = model.getThread(tid);
|
||||
if (t == null) {
|
||||
model.addThread(new VisualizerThread(core, pid, osTid, tid, state));
|
||||
model.addThread(new VisualizerThread(core, pid, osTid, tid, state, frame));
|
||||
}
|
||||
// if the thread is already in the model, update it's parameters.
|
||||
else {
|
||||
t.setCore(core);
|
||||
t.setTID(osTid);
|
||||
t.setState(state);
|
||||
t.setLocationInfo(frame);
|
||||
}
|
||||
|
||||
|
||||
// keep track of threads visited
|
||||
done(1, model);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012, 2013 Tilera Corporation and others.
|
||||
* Copyright (c) 2012, 2014 Tilera Corporation 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
|
||||
|
@ -17,6 +17,7 @@
|
|||
* Marc Dumais (Ericsson) - Bug 404894
|
||||
* Marc Dumais (Ericsson) - Bug 405390
|
||||
* Marc Dumais (Ericsson) - Bug 407321
|
||||
* Xavier Raynaud (Kalray) - Bug 431935
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
||||
|
@ -33,6 +34,7 @@ import org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.model.VisualizerC
|
|||
import org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.model.VisualizerModel;
|
||||
import org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.model.VisualizerThread;
|
||||
import org.eclipse.cdt.visualizer.ui.canvas.GraphicCanvas;
|
||||
import org.eclipse.cdt.visualizer.ui.canvas.IGraphicObject;
|
||||
import org.eclipse.cdt.visualizer.ui.plugin.CDTVisualizerUIPlugin;
|
||||
import org.eclipse.cdt.visualizer.ui.util.GUIUtils;
|
||||
import org.eclipse.cdt.visualizer.ui.util.MouseMonitor;
|
||||
|
@ -1120,4 +1122,22 @@ public class MulticoreVisualizerCanvas extends GraphicCanvas
|
|||
public boolean isFilterActive() {
|
||||
return m_canvasFilterManager.isCurrentFilterActive();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IGraphicObject getGraphicObject(Class<?> type, int x, int y) {
|
||||
// Why m_cpus are not added in super.m_objects ?
|
||||
IGraphicObject result = null;
|
||||
for (IGraphicObject gobj : getSelectableObjects()) {
|
||||
if (gobj.contains(x, y)) {
|
||||
if (type != null) {
|
||||
Class<?> objType = gobj.getClass();
|
||||
if (! type.isAssignableFrom(objType)) continue;
|
||||
}
|
||||
result = gobj;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012, 2013 Ericsson and others.
|
||||
* Copyright (c) 2012, 2014 Ericsson 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
|
||||
|
@ -14,6 +14,7 @@
|
|||
* Marc Dumais (Ericsson) - Bug 409512
|
||||
* Marc Dumais (Ericsson) - Bug 409965
|
||||
* Marc Dumais (Ericsson) - Bug 416524
|
||||
* Xavier Raynaud (Kalray) - Bug 431935
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
||||
|
@ -33,6 +34,9 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl.IResumedDMEvent;
|
|||
import org.eclipse.cdt.dsf.debug.service.IRunControl.IStartedDMEvent;
|
||||
import org.eclipse.cdt.dsf.debug.service.IRunControl.ISuspendedDMEvent;
|
||||
import org.eclipse.cdt.dsf.debug.service.IRunControl.StateChangeReason;
|
||||
import org.eclipse.cdt.dsf.debug.service.IStack;
|
||||
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
|
||||
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
|
||||
import org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.MulticoreVisualizerUIPlugin;
|
||||
import org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.model.VisualizerCore;
|
||||
import org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.model.VisualizerExecutionState;
|
||||
|
@ -87,6 +91,7 @@ public class MulticoreVisualizerEventListener {
|
|||
|
||||
IDMContext context = event.getDMContext();
|
||||
|
||||
|
||||
// all-stop mode? If so, we take the opportunity, now that GDB has suspended
|
||||
// execution, to re-create the model so that we synchronize with the debug session
|
||||
if (context != null && isSessionAllStop(context.getSessionId()) ) {
|
||||
|
@ -104,10 +109,11 @@ public class MulticoreVisualizerEventListener {
|
|||
IThreadDMContext threadContext =
|
||||
DMContexts.getAncestorOfType(execDmc, IThreadDMContext.class);
|
||||
|
||||
DsfServicesTracker tracker =
|
||||
final DsfServicesTracker tracker =
|
||||
new DsfServicesTracker(MulticoreVisualizerUIPlugin.getBundleContext(),
|
||||
execDmc.getSessionId());
|
||||
IProcesses procService = tracker.getService(IProcesses.class);
|
||||
final IStack stackService = tracker.getService(IStack.class);
|
||||
tracker.dispose();
|
||||
|
||||
procService.getExecutionData(threadContext,
|
||||
|
@ -122,16 +128,16 @@ public class MulticoreVisualizerEventListener {
|
|||
if (cores != null) {
|
||||
assert cores.length == 1; // A thread belongs to a single core
|
||||
int coreId = Integer.parseInt(cores[0]);
|
||||
VisualizerCore vCore = model.getCore(coreId);
|
||||
final VisualizerCore vCore = model.getCore(coreId);
|
||||
|
||||
int tid = execDmc.getThreadId();
|
||||
|
||||
VisualizerThread thread = model.getThread(tid);
|
||||
final VisualizerThread thread = model.getThread(tid);
|
||||
|
||||
if (thread != null) {
|
||||
assert thread.getState() == VisualizerExecutionState.RUNNING;
|
||||
|
||||
VisualizerExecutionState newState = VisualizerExecutionState.SUSPENDED;
|
||||
VisualizerExecutionState _newState = VisualizerExecutionState.SUSPENDED;
|
||||
|
||||
if (event.getReason() == StateChangeReason.SIGNAL) {
|
||||
if (event instanceof IMIDMEvent) {
|
||||
|
@ -139,15 +145,42 @@ public class MulticoreVisualizerEventListener {
|
|||
if (miEvent instanceof MISignalEvent) {
|
||||
String signalName = ((MISignalEvent)miEvent).getName();
|
||||
if (DSFDebugModel.isCrashSignal(signalName)) {
|
||||
newState = VisualizerExecutionState.CRASHED;
|
||||
_newState = VisualizerExecutionState.CRASHED;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
thread.setState(newState);
|
||||
thread.setCore(vCore);
|
||||
fVisualizer.refresh();
|
||||
final VisualizerExecutionState newState = _newState;
|
||||
if (stackService != null) {
|
||||
stackService.getTopFrame(execDmc,
|
||||
new ImmediateDataRequestMonitor<IFrameDMContext>(null) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
IFrameDMContext targetFrameContext = null;
|
||||
if (isSuccess()) {
|
||||
targetFrameContext = getData();
|
||||
}
|
||||
if (targetFrameContext != null) {
|
||||
stackService.getFrameData(targetFrameContext,
|
||||
new ImmediateDataRequestMonitor<IFrameDMData>(null) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
IFrameDMData frameData = null;
|
||||
if (isSuccess()) {
|
||||
frameData = getData();
|
||||
}
|
||||
updateThread(thread, newState, vCore, frameData);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
updateThread(thread, newState, vCore, null);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
updateThread(thread, newState, vCore, null);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -156,6 +189,13 @@ public class MulticoreVisualizerEventListener {
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateThread(VisualizerThread thread, VisualizerExecutionState newState, VisualizerCore vCore, IFrameDMData frameData) {
|
||||
thread.setState(newState);
|
||||
thread.setCore(vCore);
|
||||
thread.setLocationInfo(frameData);
|
||||
fVisualizer.refresh();
|
||||
}
|
||||
|
||||
/** Invoked when a thread or process is resumed. */
|
||||
@DsfServiceEventHandler
|
||||
|
@ -173,6 +213,7 @@ public class MulticoreVisualizerEventListener {
|
|||
List<VisualizerThread> tList = model.getThreads();
|
||||
for(VisualizerThread t : tList) {
|
||||
t.setState(VisualizerExecutionState.RUNNING);
|
||||
t.setLocationInfo((String) null);
|
||||
}
|
||||
fVisualizer.getMulticoreVisualizerCanvas().requestUpdate();
|
||||
return;
|
||||
|
@ -192,6 +233,7 @@ public class MulticoreVisualizerEventListener {
|
|||
thread.getState() == VisualizerExecutionState.CRASHED;
|
||||
|
||||
thread.setState(VisualizerExecutionState.RUNNING);
|
||||
thread.setLocationInfo((String) null);
|
||||
fVisualizer.getMulticoreVisualizerCanvas().requestUpdate();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* William R. Swanson (Tilera Corporation) - initial API and implementation
|
||||
* Xavier Raynaud (Kalray) - Bug 431690, 432151
|
||||
* Xavier Raynaud (Kalray) - Bug 431690, 432151, 431935
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
||||
|
@ -188,4 +188,10 @@ public class MulticoreVisualizerThread extends MulticoreVisualizerGraphicObject
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTooltip(int x, int y) {
|
||||
return m_thread.getLocationInfo();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Tilera Corporation and others.
|
||||
* Copyright (c) 2012, 2014 Tilera Corporation 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
|
||||
|
@ -8,6 +8,7 @@
|
|||
* Contributors:
|
||||
* William R. Swanson (Tilera Corporation) - initial API and implementation
|
||||
* Marc Dumais (Ericsson) - Add CPU/core load information to the multicore visualizer (Bug 396268)
|
||||
* Xavier Raynaud (Kalray) - Bug 431935
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.utils;
|
||||
|
@ -29,6 +30,9 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
|
|||
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMData;
|
||||
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMData2;
|
||||
import org.eclipse.cdt.dsf.debug.service.IRunControl.StateChangeReason;
|
||||
import org.eclipse.cdt.dsf.debug.service.IStack;
|
||||
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
|
||||
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
|
||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
|
||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
|
||||
import org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.model.VisualizerExecutionState;
|
||||
|
@ -301,7 +305,7 @@ public class DSFDebugModel {
|
|||
/** Requests execution state of a thread.
|
||||
* Calls back to getThreadExecutionStateDone() on listener. */
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public static void getThreadExecutionState(DSFSessionState sessionState,
|
||||
public static void getThreadExecutionState(final DSFSessionState sessionState,
|
||||
final ICPUDMContext cpuContext,
|
||||
final ICoreDMContext coreContext,
|
||||
final IMIExecutionDMContext execContext,
|
||||
|
@ -312,25 +316,66 @@ public class DSFDebugModel {
|
|||
IRunControl runControl = sessionState.getService(IRunControl.class);
|
||||
|
||||
if (runControl == null) {
|
||||
listener.getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData, null, arg);
|
||||
listener.getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData, null, null, arg);
|
||||
return;
|
||||
}
|
||||
|
||||
if (runControl.isSuspended(execContext) == false) {
|
||||
// The thread is running
|
||||
listener.getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData,
|
||||
listener.getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData, null,
|
||||
VisualizerExecutionState.RUNNING, arg);
|
||||
} else {
|
||||
// For a suspended thread, let's see why it is suspended,
|
||||
// to find out if the thread is crashed
|
||||
// For a suspended thread, retrieve the current stack
|
||||
final IStack stackService = sessionState.getService(IStack.class);
|
||||
if (stackService != null) {
|
||||
stackService.getTopFrame(execContext, new ImmediateDataRequestMonitor<IFrameDMContext>(null) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
IFrameDMContext targetFrameContext = null;
|
||||
if (isSuccess()) {
|
||||
targetFrameContext = getData();
|
||||
}
|
||||
if (targetFrameContext!= null) {
|
||||
stackService.getFrameData(targetFrameContext, new ImmediateDataRequestMonitor<IFrameDMData>(null) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
IFrameDMData frameData = null;
|
||||
if (isSuccess()) {
|
||||
frameData = getData();
|
||||
}
|
||||
getThreadSuspendReason(sessionState, cpuContext, coreContext, execContext, threadData, frameData, listener, arg);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
getThreadSuspendReason(sessionState, cpuContext, coreContext, execContext, threadData, null, listener, arg);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
getThreadSuspendReason(sessionState, cpuContext, coreContext, execContext, threadData, null, listener, arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For a suspended thread, let's see why it is suspended,
|
||||
// to find out if the thread is crashed
|
||||
private static void getThreadSuspendReason(DSFSessionState sessionState,
|
||||
final ICPUDMContext cpuContext,
|
||||
final ICoreDMContext coreContext,
|
||||
final IMIExecutionDMContext execContext,
|
||||
final IThreadDMData threadData,
|
||||
final IFrameDMData frameData,
|
||||
final DSFDebugModelListener listener,
|
||||
final Object arg) {
|
||||
IRunControl runControl = sessionState.getService(IRunControl.class);
|
||||
if (runControl != null) {
|
||||
runControl.getExecutionData(execContext,
|
||||
new ImmediateDataRequestMonitor<IExecutionDMData>() {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
IExecutionDMData executionData = getData();
|
||||
|
||||
VisualizerExecutionState state = VisualizerExecutionState.SUSPENDED;
|
||||
|
||||
|
||||
if (isSuccess() && executionData != null) {
|
||||
if (executionData.getStateChangeReason() == StateChangeReason.SIGNAL) {
|
||||
if (executionData instanceof IExecutionDMData2) {
|
||||
|
@ -343,12 +388,12 @@ public class DSFDebugModel {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
listener.getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData, state, arg);
|
||||
listener.getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData, frameData, state, arg);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
listener.getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData, frameData, null, arg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Tilera Corporation and others.
|
||||
* Copyright (c) 2012, 2014 Tilera Corporation 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
|
||||
|
@ -8,6 +8,7 @@
|
|||
* Contributors:
|
||||
* William R. Swanson (Tilera Corporation) - initial API and implementation
|
||||
* Marc Dumais (Ericsson) - Add CPU/core load information to the multicore visualizer (Bug 396268)
|
||||
* Xavier Raynaud (Kalray) - Bug 431935
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.utils;
|
||||
|
@ -15,6 +16,7 @@ package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.utils;
|
|||
|
||||
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
||||
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData;
|
||||
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
|
||||
import org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.model.VisualizerExecutionState;
|
||||
import org.eclipse.cdt.dsf.gdb.service.IGDBHardwareAndOS.ICPUDMContext;
|
||||
import org.eclipse.cdt.dsf.gdb.service.IGDBHardwareAndOS.ICoreDMContext;
|
||||
|
@ -64,6 +66,7 @@ public interface DSFDebugModelListener {
|
|||
ICoreDMContext coreContext,
|
||||
IMIExecutionDMContext threadContext,
|
||||
IThreadDMData threadData,
|
||||
IFrameDMData frame,
|
||||
VisualizerExecutionState state,
|
||||
Object arg);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue