diff options
author | Marc Dumais | 2013-09-04 18:06:19 +0000 |
---|---|---|
committer | Marc Khouzam | 2013-09-05 19:48:21 +0000 |
commit | cf3f7a88971d00f5876c393d76630c2f64bc730b (patch) | |
tree | 64ad0dc484dbf68701d84f7c55e652c54fbd0c0b /dsf-gdb | |
parent | 7e3098b0264e2eb2bf35a5dc26e73628e094e8a2 (diff) | |
download | org.eclipse.cdt-cf3f7a88971d00f5876c393d76630c2f64bc730b.tar.gz org.eclipse.cdt-cf3f7a88971d00f5876c393d76630c2f64bc730b.tar.xz org.eclipse.cdt-cf3f7a88971d00f5876c393d76630c2f64bc730b.zip |
Bug 416524 - [Visualizer] NPE first session in C++ perspective
Change-Id: I586bccc85b043d7e1cadf5298aaf3c22bb79e950
Signed-off-by: Marc Dumais <marc.dumais@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/16156
Reviewed-by: Alvaro Sanchez-Leon <alvsan09@gmail.com>
Reviewed-by: Marc Khouzam <marc.khouzam@ericsson.com>
IP-Clean: Marc Khouzam <marc.khouzam@ericsson.com>
Tested-by: Marc Khouzam <marc.khouzam@ericsson.com>
Diffstat (limited to 'dsf-gdb')
-rw-r--r-- | dsf-gdb/org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui/src/org/eclipse/cdt/dsf/gdb/multicorevisualizer/internal/ui/view/MulticoreVisualizerEventListener.java | 52 |
1 files changed, 37 insertions, 15 deletions
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 2ebf8721949..338a3cd3ad7 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 @@ -13,6 +13,7 @@ * Marc Dumais (Ericsson) - Bug 396269 * Marc Dumais (Ericsson) - Bug 409512 * Marc Dumais (Ericsson) - Bug 409965 + * Marc Dumais (Ericsson) - Bug 416524 *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view; @@ -78,6 +79,12 @@ public class MulticoreVisualizerEventListener { */ @DsfServiceEventHandler public void handleEvent(final ISuspendedDMEvent event) { + // make sure model exists + final VisualizerModel model = fVisualizer.getModel(); + if (model == null) { + return; + } + IDMContext context = event.getDMContext(); // all-stop mode? If so, we take the opportunity, now that GDB has suspended @@ -115,11 +122,11 @@ 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 = fVisualizer.getModel().getCore(coreId); + VisualizerCore vCore = model.getCore(coreId); int tid = execDmc.getThreadId(); - VisualizerThread thread = fVisualizer.getModel().getThread(tid); + VisualizerThread thread = model.getThread(tid); if (thread != null) { assert thread.getState() == VisualizerExecutionState.RUNNING; @@ -153,11 +160,17 @@ public class MulticoreVisualizerEventListener { /** Invoked when a thread or process is resumed. */ @DsfServiceEventHandler public void handleEvent(IResumedDMEvent event) { + // make sure model exists + VisualizerModel model = fVisualizer.getModel(); + if (model == null) { + return; + } + IDMContext context = event.getDMContext(); // in all-stop mode... : update all threads states to "running" if (context != null && isSessionAllStop(context.getSessionId()) ) { - List<VisualizerThread> tList = fVisualizer.getModel().getThreads(); + List<VisualizerThread> tList = model.getThreads(); for(VisualizerThread t : tList) { t.setState(VisualizerExecutionState.RUNNING); } @@ -172,7 +185,7 @@ public class MulticoreVisualizerEventListener { // Thread resumed int tid = ((IMIExecutionDMContext)context).getThreadId(); - VisualizerThread thread = fVisualizer.getModel().getThread(tid); + VisualizerThread thread = model.getThread(tid); if (thread != null) { assert thread.getState() == VisualizerExecutionState.SUSPENDED || @@ -187,6 +200,12 @@ public class MulticoreVisualizerEventListener { /** Invoked when a thread or process starts. */ @DsfServiceEventHandler public void handleEvent(IStartedDMEvent event) { + // make sure model exists + final VisualizerModel model = fVisualizer.getModel(); + if (model == null) { + return; + } + IDMContext context = event.getDMContext(); if (context == null) return; final String sessionId = context.getSessionId(); @@ -201,11 +220,8 @@ public class MulticoreVisualizerEventListener { final IMIProcessDMContext processContext = DMContexts.getAncestorOfType(execDmc, IMIProcessDMContext.class); - VisualizerModel model = fVisualizer.getModel(); - if (model == null) return; - // put it on core zero - VisualizerCore vCore = fVisualizer.getModel().getCore(0); + VisualizerCore vCore = model.getCore(0); if (vCore == null) return; int pid = Integer.parseInt(processContext.getProcId()); @@ -216,8 +232,8 @@ public class MulticoreVisualizerEventListener { // 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 (fVisualizer.getModel().getThread(tid) == null ) { - fVisualizer.getModel().addThread(new VisualizerThread(vCore, pid, osTid, tid, VisualizerExecutionState.RUNNING)); + if (model.getThread(tid) == null ) { + model.addThread(new VisualizerThread(vCore, pid, osTid, tid, VisualizerExecutionState.RUNNING)); fVisualizer.getMulticoreVisualizerCanvas().requestUpdate(); } return; @@ -252,7 +268,7 @@ 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 = fVisualizer.getModel().getCore(coreId); + VisualizerCore vCore = model.getCore(coreId); // There is a race condition that sometimes happens here. We can reach // here because we were notified that a thread is started, but the model // is not yet completely constructed. If the model doesn't yet contain the @@ -277,8 +293,8 @@ public class MulticoreVisualizerEventListener { // 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 (fVisualizer.getModel().getThread(tid) == null ) { - fVisualizer.getModel().addThread(new VisualizerThread(vCore, pid, osTid, tid, VisualizerExecutionState.RUNNING)); + if (model.getThread(tid) == null ) { + model.addThread(new VisualizerThread(vCore, pid, osTid, tid, VisualizerExecutionState.RUNNING)); fVisualizer.getMulticoreVisualizerCanvas().requestUpdate(); } } @@ -292,6 +308,12 @@ public class MulticoreVisualizerEventListener { /** Invoked when a thread or process exits. */ @DsfServiceEventHandler public void handleEvent(IExitedDMEvent event) { + // make sure model exists + final VisualizerModel model = fVisualizer.getModel(); + if (model == null) { + return; + } + IDMContext context = event.getDMContext(); final MulticoreVisualizerCanvas canvas = fVisualizer.getMulticoreVisualizerCanvas(); @@ -319,7 +341,7 @@ public class MulticoreVisualizerEventListener { for (IDMContext c : contexts) { if (c instanceof IMIExecutionDMContext) { int tid = ((IMIExecutionDMContext)c).getThreadId(); - fVisualizer.getModel().markThreadExited(tid); + model.markThreadExited(tid); } } @@ -339,7 +361,7 @@ public class MulticoreVisualizerEventListener { // Thread exited int tid = ((IMIExecutionDMContext)context).getThreadId(); - fVisualizer.getModel().markThreadExited(tid); + model.markThreadExited(tid); if (canvas != null) { canvas.requestUpdate(); |