1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

[268721] [disassembly] Service tracker and service used on wrong thread

This commit is contained in:
Anton Leherbauer 2009-03-16 10:18:11 +00:00
parent 435362c89d
commit f0a0f1b4ad
2 changed files with 144 additions and 82 deletions

View file

@ -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,62 +2178,62 @@ 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.submit(new Runnable() {
public void run() {
stack.getTopFrame(targetContext, request);
}});
} else {
// TODO retrieve other stack frame
}
return;
}
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);
}
}
});
}
}
};
executor.submit(new Runnable() {
executor.execute(new DsfRunnable() {
public void run() {
stack.getFrameData(fTargetFrameContext, request);
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);
}
}
});
} else {
// TODO retrieve other stack frame
}
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);
}
}
});
}
}
});
}
private void addressSizeChanged(int addressSize) {
BigInteger oldEndAddress= fEndAddress;
fEndAddress= BigInteger.ONE.shiftLeft(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);
}
};

View file

@ -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() {