Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/dsf
diff options
context:
space:
mode:
authorAnton Leherbauer2009-03-16 10:18:11 +0000
committerAnton Leherbauer2009-03-16 10:18:11 +0000
commitf0a0f1b4ad86bfc1ebace3567d598b34dc742640 (patch)
treee419a987cdc11c09bc0a4649fa93033bba545a9d /dsf
parent435362c89dc5e779daeb6f75668077e46c112f8d (diff)
downloadorg.eclipse.cdt-f0a0f1b4ad86bfc1ebace3567d598b34dc742640.tar.gz
org.eclipse.cdt-f0a0f1b4ad86bfc1ebace3567d598b34dc742640.tar.xz
org.eclipse.cdt-f0a0f1b4ad86bfc1ebace3567d598b34dc742640.zip
[268721] [disassembly] Service tracker and service used on wrong thread
Diffstat (limited to 'dsf')
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java194
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java28
2 files changed, 142 insertions, 80 deletions
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java
index a8076def62c..66f29f6516a 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2008 Wind River Systems and others.
+ * Copyright (c) 2007, 2009 Wind River Systems 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
@@ -24,8 +24,10 @@ import java.util.concurrent.ExecutionException;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICBreakpointType;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
+import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
@@ -1496,18 +1498,18 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyPart#gotoSymbol(java.lang.String)
*/
public final void gotoSymbol(final String symbol) {
- if (!fActive || !isSuspended() || fTargetFrameContext == null) {
+ if (!fActive || fTargetFrameContext == null) {
return;
}
- final IExpressions expressions= getService(IExpressions.class);
- if (expressions == null) {
- return;
- }
- IExpressionDMContext exprDmc= expressions.createExpression(fTargetContext, '&'+symbol);
- final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT);
final DsfExecutor executor= getSession().getExecutor();
- executor.submit(new Runnable() {
+ executor.execute(new DsfRunnable() {
public void run() {
+ final IExpressions expressions= getService(IExpressions.class);
+ if (expressions == null) {
+ return;
+ }
+ IExpressionDMContext exprDmc= expressions.createExpression(fTargetContext, '&'+symbol);
+ final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT);
expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor<FormattedValueDMData>(executor, null) {
@Override
protected void handleSuccess() {
@@ -1788,7 +1790,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
internalError(exc);
}
- final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
final String finalFile= debuggerPath;
@@ -1819,8 +1820,14 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
};
assert !fUpdatePending;
fUpdatePending = true;
- executor.submit(new Runnable() {
+ executor.execute(new Runnable() {
public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
disassembly.getMixedInstructions(context, finalFile, 1, lines, disassemblyRequest);
}});
}
@@ -1856,7 +1863,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
final BigInteger finalEndAddress= endAddress;
final DsfExecutor executor= getSession().getExecutor();
- final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
if (mixed) {
@@ -1889,13 +1895,25 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
};
if (file != null) {
- executor.submit(new Runnable() {
+ executor.execute(new Runnable() {
public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
disassembly.getMixedInstructions(context, finalFile, finalLineNumber, lines*2, disassemblyRequest);
}});
} else {
- executor.submit(new Runnable() {
+ executor.execute(new Runnable() {
public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
disassembly.getMixedInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
}});
}
@@ -1925,13 +1943,25 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
};
if (file != null) {
- executor.submit(new Runnable() {
+ executor.execute(new Runnable() {
public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
disassembly.getInstructions(context, finalFile, finalLineNumber, lines, disassemblyRequest);
}});
} else {
- executor.submit(new Runnable() {
+ executor.execute(new Runnable() {
public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
disassembly.getInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
}});
}
@@ -2148,60 +2178,60 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
if (DEBUG) System.out.println("retrieveFrameAddress "+frame); //$NON-NLS-1$
fUpdatePending = true;
- final IStack stack= fServicesTracker.getService(IStack.class);
final DsfExecutor executor= getSession().getExecutor();
- if (fTargetFrameContext == null) {
- if (frame == 0) {
- final DataRequestMonitor<IFrameDMContext> request= new DataRequestMonitor<IFrameDMContext>(executor, null) {
- @Override
- protected void handleCompleted() {
- fUpdatePending= false;
- fTargetFrameContext= getData();
- if (fTargetFrameContext != null) {
- retrieveFrameAddress(targetContext, frame);
- }
+ executor.execute(new DsfRunnable() {
+ public void run() {
+ retrieveFrameAddressInSessionThread(targetContext, frame);
+ }});
+ }
+ }
+
+ private void retrieveFrameAddressInSessionThread(final IExecutionDMContext targetContext, final int frame) {
+ final IStack stack= fServicesTracker.getService(IStack.class);
+ final DsfExecutor executor= getSession().getExecutor();
+ if (fTargetFrameContext == null) {
+ if (frame == 0) {
+ stack.getTopFrame(targetContext, new DataRequestMonitor<IFrameDMContext>(executor, null) {
+ @Override
+ protected void handleCompleted() {
+ fUpdatePending= false;
+ fTargetFrameContext= getData();
+ if (fTargetFrameContext != null) {
+ retrieveFrameAddressInSessionThread(targetContext, frame);
}
- };
- executor.submit(new Runnable() {
- public void run() {
- stack.getTopFrame(targetContext, request);
- }});
- } else {
- // TODO retrieve other stack frame
- }
- return;
+ }
+ });
+ } else {
+ // TODO retrieve other stack frame
}
- final DataRequestMonitor<IFrameDMData> request= new DataRequestMonitor<IFrameDMData>(executor, null) {
- @Override
- protected void handleCompleted() {
- if (!isCanceled()) {
- fUpdatePending= false;
- final IFrameDMData frameData= getData();
- fTargetFrameData= frameData;
- final IAddress address= frameData.getAddress();
- final BigInteger addressValue= address.getValue();
- if (DEBUG) System.out.println("retrieveFrameAddress done "+getAddressText(addressValue)); //$NON-NLS-1$
- asyncExec(new Runnable() {
- public void run() {
- if (address.getSize() * 4 > fAddressSize) {
- addressSizeChanged(address.getSize() * 4);
- }
- if (frame == 0) {
- updatePC(addressValue);
- } else {
- gotoFrame(frame, addressValue);
- }
+ return;
+ }
+ stack.getFrameData(fTargetFrameContext, new DataRequestMonitor<IFrameDMData>(executor, null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isCanceled()) {
+ fUpdatePending= false;
+ final IFrameDMData frameData= getData();
+ fTargetFrameData= frameData;
+ final IAddress address= frameData.getAddress();
+ final BigInteger addressValue= address.getValue();
+ if (DEBUG) System.out.println("retrieveFrameAddress done "+getAddressText(addressValue)); //$NON-NLS-1$
+ asyncExec(new Runnable() {
+ public void run() {
+ if (address.getSize() * 4 > fAddressSize) {
+ addressSizeChanged(address.getSize() * 4);
}
+ if (frame == 0) {
+ updatePC(addressValue);
+ } else {
+ gotoFrame(frame, addressValue);
+ }
+ }
- });
- }
+ });
}
- };
- executor.submit(new Runnable() {
- public void run() {
- stack.getFrameData(fTargetFrameContext, request);
- }});
- }
+ }
+ });
}
private void addressSizeChanged(int addressSize) {
@@ -2722,8 +2752,31 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
fRulerContextMenuListeners.remove(listener);
}
- private boolean isSuspended(IExecutionDMContext targetContext) {
- return getRunControl().isSuspended(targetContext);
+ private boolean isSuspended(final IExecutionDMContext targetContext) {
+ DsfSession session = getSession();
+ if (session == null || !session.isActive()) {
+ return false;
+ }
+ if (session.getExecutor().isInExecutorThread()) {
+ return getRunControl().isSuspended(targetContext);
+ }
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(DataRequestMonitor<Boolean> rm) {
+ try {
+ rm.setData(getRunControl().isSuspended(targetContext));
+ } finally {
+ rm.done();
+ }
+ }
+ };
+ session.getExecutor().execute(query);
+ try {
+ return query.get();
+ } catch (InterruptedException exc) {
+ } catch (ExecutionException exc) {
+ }
+ return false;
}
private IRunControl getRunControl() {
@@ -3280,12 +3333,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
} catch (BadLocationException e) {
// should not happen, but its safe to ignore anyway
}
- boolean lineBreakpoint = srcPos != null && srcPos.length > 0;
IResource resource;
ICBreakpoint bp;
- if (lineBreakpoint) {
+ if (srcPos != null && srcPos.length > 0) {
SourceFileInfo srcInfo = srcPos.fFileInfo;
String filePath = null;
resource = (IResource)srcInfo.fFile.getAdapter(IResource.class);
@@ -3305,11 +3357,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
if (pos instanceof DisassemblyPosition) {
srcLine = ((DisassemblyPosition)pos).getLine();
}
- bp= CDIDebugModel.createLineBreakpoint(filePath, resource, srcLine + 1, true, 0, "", true); //$NON-NLS-1$
+ bp= CDIDebugModel.createLineBreakpoint(filePath, resource, srcLine + 1, ICBreakpointType.REGULAR, true, 0, "", true); //$NON-NLS-1$
} else {
resource = ResourcesPlugin.getWorkspace().getRoot();
BigInteger address = getAddressOfLine(line);
- bp= CDIDebugModel.createAddressBreakpoint(null, null, resource, new Addr64(address), true, 0, "", true); //$NON-NLS-1$
+ bp= CDIDebugModel.createAddressBreakpoint(null, null, resource, ICBreakpointType.REGULAR, new Addr64(address), true, 0, "", true); //$NON-NLS-1$
}
return bp;
@@ -3320,7 +3372,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
if (fFile2Storage.containsKey(file)) {
sourceElement = fFile2Storage.get(file);
} else {
- final ISourceLookup lookup= getService(ISourceLookup.class);
final ISourceLookupDMContext ctx= DMContexts.getAncestorOfType(fTargetContext, ISourceLookupDMContext.class);
final DsfExecutor executor= getSession().getExecutor();
Query<Object> query= new Query<Object>() {
@@ -3333,6 +3384,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
rm.done();
}
};
+ final ISourceLookup lookup= getService(ISourceLookup.class);
lookup.getSource(ctx, file, request);
}
};
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java
index 4d6fc9eac78..585e023af60 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2008 Wind River Systems and others.
+ * Copyright (c) 2007, 2009 Wind River Systems 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
@@ -15,6 +15,7 @@ import java.util.concurrent.ExecutionException;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyDocument;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyPosition;
@@ -22,9 +23,11 @@ import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.LabelPosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourcePosition;
import org.eclipse.cdt.dsf.debug.service.IExpressions;
import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
+import org.eclipse.cdt.dsf.debug.service.IRunControl;
import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.cdt.internal.ui.text.CWordFinder;
@@ -108,21 +111,28 @@ public class DisassemblyTextHover implements ITextHover {
* @param expr
* @return expression value or <code>null</code>
*/
- private String evaluateExpression(String expr) {
- final IExpressions expressions= fDisassemblyPart.getService(IExpressions.class);
- if (expressions == null) {
- return null;
- }
+ private String evaluateExpression(final String expr) {
final IFrameDMContext frameDmc= fDisassemblyPart.getTargetFrameContext();
- if (frameDmc == null || !fDisassemblyPart.isSuspended()) {
+ if (frameDmc == null) {
return null;
}
- IExpressionDMContext exprDmc= expressions.createExpression(frameDmc, expr);
- final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT);
final DsfExecutor executor= fDisassemblyPart.getSession().getExecutor();
Query<FormattedValueDMData> query= new Query<FormattedValueDMData>() {
@Override
protected void execute(final DataRequestMonitor<FormattedValueDMData> rm) {
+ IExecutionDMContext exeCtx = DMContexts.getAncestorOfType(frameDmc, IExecutionDMContext.class);
+ final IRunControl rc= fDisassemblyPart.getService(IRunControl.class);
+ if (rc == null || !rc.isSuspended(exeCtx)) {
+ rm.done();
+ return;
+ }
+ final IExpressions expressions= fDisassemblyPart.getService(IExpressions.class);
+ if (expressions == null) {
+ rm.done();
+ return;
+ }
+ IExpressionDMContext exprDmc= expressions.createExpression(frameDmc, expr);
+ final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT);
expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor<FormattedValueDMData>(executor, rm) {
@Override
protected void handleSuccess() {

Back to the top