diff options
author | Xavier Raynaud | 2014-04-11 11:35:05 +0000 |
---|---|---|
committer | Marc Dumais | 2014-04-11 11:45:40 +0000 |
commit | 62e660108a9b078e51fcace8c651b99f08aef1c5 (patch) | |
tree | 2864c14dfcb86d681ae16f1bbb3880ca06a6359c /dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui | |
parent | 882369b295726765c09898a055a9d9abd4597f5c (diff) | |
download | org.eclipse.cdt-62e660108a9b078e51fcace8c651b99f08aef1c5.tar.gz org.eclipse.cdt-62e660108a9b078e51fcace8c651b99f08aef1c5.tar.xz org.eclipse.cdt-62e660108a9b078e51fcace8c651b99f08aef1c5.zip |
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>
Diffstat (limited to 'dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui')
9 files changed, 240 insertions, 31 deletions
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/META-INF/MANIFEST.MF b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/META-INF/MANIFEST.MF index 43187241511..49da4433543 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/META-INF/MANIFEST.MF +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/META-INF/MANIFEST.MF @@ -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 diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/model/VisualizerModel.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/model/VisualizerModel.java index 0a967ad7552..820f9c102b8 100755 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/model/VisualizerModel.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/model/VisualizerModel.java @@ -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); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/model/VisualizerThread.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/model/VisualizerThread.java index 2ebc8cbed82..159fc45e36b 100755 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/model/VisualizerThread.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/model/VisualizerThread.java @@ -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; + } + } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizer.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizer.java index 1e6ad260b6e..028ee21f688 100755 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizer.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizer.java @@ -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); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerCanvas.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerCanvas.java index f5450156c62..d26e93996db 100755 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerCanvas.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerCanvas.java @@ -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; + } + } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerEventListener.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerEventListener.java index 338a3cd3ad7..9ab24c3044f 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerEventListener.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerEventListener.java @@ -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(); } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerThread.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerThread.java index 91003cdffca..6b5cbeeb56d 100755 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerThread.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerThread.java @@ -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(); + } + } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/utils/DSFDebugModel.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/utils/DSFDebugModel.java index add78f58485..aaae55b19d2 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/utils/DSFDebugModel.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/utils/DSFDebugModel.java @@ -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); } - } /** diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/utils/DSFDebugModelListener.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/utils/DSFDebugModelListener.java index 2336d6de0f0..baf66438723 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/utils/DSFDebugModelListener.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/utils/DSFDebugModelListener.java @@ -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); |