diff options
author | Anton Leherbauer | 2009-03-16 10:18:11 +0000 |
---|---|---|
committer | Anton Leherbauer | 2009-03-16 10:18:11 +0000 |
commit | f0a0f1b4ad86bfc1ebace3567d598b34dc742640 (patch) | |
tree | e419a987cdc11c09bc0a4649fa93033bba545a9d /dsf | |
parent | 435362c89dc5e779daeb6f75668077e46c112f8d (diff) | |
download | org.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')
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() { |