mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 13:25:45 +02:00
[268721] [disassembly] Service tracker and service used on wrong thread
This commit is contained in:
parent
435362c89d
commit
f0a0f1b4ad
2 changed files with 144 additions and 82 deletions
|
@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* 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.core.IAddress;
|
||||||
import org.eclipse.cdt.debug.core.CDIDebugModel;
|
import org.eclipse.cdt.debug.core.CDIDebugModel;
|
||||||
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
|
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.DataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
|
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.concurrent.Query;
|
||||||
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
||||||
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
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)
|
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyPart#gotoSymbol(java.lang.String)
|
||||||
*/
|
*/
|
||||||
public final void gotoSymbol(final String symbol) {
|
public final void gotoSymbol(final String symbol) {
|
||||||
if (!fActive || !isSuspended() || fTargetFrameContext == null) {
|
if (!fActive || fTargetFrameContext == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
final DsfExecutor executor= getSession().getExecutor();
|
||||||
|
executor.execute(new DsfRunnable() {
|
||||||
|
public void run() {
|
||||||
final IExpressions expressions= getService(IExpressions.class);
|
final IExpressions expressions= getService(IExpressions.class);
|
||||||
if (expressions == null) {
|
if (expressions == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
IExpressionDMContext exprDmc= expressions.createExpression(fTargetContext, '&'+symbol);
|
IExpressionDMContext exprDmc= expressions.createExpression(fTargetContext, '&'+symbol);
|
||||||
final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT);
|
final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT);
|
||||||
final DsfExecutor executor= getSession().getExecutor();
|
|
||||||
executor.submit(new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor<FormattedValueDMData>(executor, null) {
|
expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor<FormattedValueDMData>(executor, null) {
|
||||||
@Override
|
@Override
|
||||||
protected void handleSuccess() {
|
protected void handleSuccess() {
|
||||||
|
@ -1788,7 +1790,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
internalError(exc);
|
internalError(exc);
|
||||||
}
|
}
|
||||||
|
|
||||||
final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
|
|
||||||
final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
|
final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
|
||||||
|
|
||||||
final String finalFile= debuggerPath;
|
final String finalFile= debuggerPath;
|
||||||
|
@ -1819,8 +1820,14 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
};
|
};
|
||||||
assert !fUpdatePending;
|
assert !fUpdatePending;
|
||||||
fUpdatePending = true;
|
fUpdatePending = true;
|
||||||
executor.submit(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
public void run() {
|
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);
|
disassembly.getMixedInstructions(context, finalFile, 1, lines, disassemblyRequest);
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
|
@ -1856,7 +1863,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
final BigInteger finalEndAddress= endAddress;
|
final BigInteger finalEndAddress= endAddress;
|
||||||
|
|
||||||
final DsfExecutor executor= getSession().getExecutor();
|
final DsfExecutor executor= getSession().getExecutor();
|
||||||
final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
|
|
||||||
final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
|
final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
|
||||||
|
|
||||||
if (mixed) {
|
if (mixed) {
|
||||||
|
@ -1889,13 +1895,25 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
executor.submit(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
public void run() {
|
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);
|
disassembly.getMixedInstructions(context, finalFile, finalLineNumber, lines*2, disassemblyRequest);
|
||||||
}});
|
}});
|
||||||
} else {
|
} else {
|
||||||
executor.submit(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
|
final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
|
||||||
|
if (disassembly == null) {
|
||||||
|
disassemblyRequest.cancel();
|
||||||
|
disassemblyRequest.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
disassembly.getMixedInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
|
disassembly.getMixedInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
|
@ -1925,13 +1943,25 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
executor.submit(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
public void run() {
|
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);
|
disassembly.getInstructions(context, finalFile, finalLineNumber, lines, disassemblyRequest);
|
||||||
}});
|
}});
|
||||||
} else {
|
} else {
|
||||||
executor.submit(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
|
final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
|
||||||
|
if (disassembly == null) {
|
||||||
|
disassemblyRequest.cancel();
|
||||||
|
disassemblyRequest.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
disassembly.getInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
|
disassembly.getInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
|
@ -2148,30 +2178,35 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
}
|
}
|
||||||
if (DEBUG) System.out.println("retrieveFrameAddress "+frame); //$NON-NLS-1$
|
if (DEBUG) System.out.println("retrieveFrameAddress "+frame); //$NON-NLS-1$
|
||||||
fUpdatePending = true;
|
fUpdatePending = true;
|
||||||
|
final DsfExecutor executor= getSession().getExecutor();
|
||||||
|
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 IStack stack= fServicesTracker.getService(IStack.class);
|
||||||
final DsfExecutor executor= getSession().getExecutor();
|
final DsfExecutor executor= getSession().getExecutor();
|
||||||
if (fTargetFrameContext == null) {
|
if (fTargetFrameContext == null) {
|
||||||
if (frame == 0) {
|
if (frame == 0) {
|
||||||
final DataRequestMonitor<IFrameDMContext> request= new DataRequestMonitor<IFrameDMContext>(executor, null) {
|
stack.getTopFrame(targetContext, new DataRequestMonitor<IFrameDMContext>(executor, null) {
|
||||||
@Override
|
@Override
|
||||||
protected void handleCompleted() {
|
protected void handleCompleted() {
|
||||||
fUpdatePending= false;
|
fUpdatePending= false;
|
||||||
fTargetFrameContext= getData();
|
fTargetFrameContext= getData();
|
||||||
if (fTargetFrameContext != null) {
|
if (fTargetFrameContext != null) {
|
||||||
retrieveFrameAddress(targetContext, frame);
|
retrieveFrameAddressInSessionThread(targetContext, frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
executor.submit(new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
stack.getTopFrame(targetContext, request);
|
|
||||||
}});
|
|
||||||
} else {
|
} else {
|
||||||
// TODO retrieve other stack frame
|
// TODO retrieve other stack frame
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final DataRequestMonitor<IFrameDMData> request= new DataRequestMonitor<IFrameDMData>(executor, null) {
|
stack.getFrameData(fTargetFrameContext, new DataRequestMonitor<IFrameDMData>(executor, null) {
|
||||||
@Override
|
@Override
|
||||||
protected void handleCompleted() {
|
protected void handleCompleted() {
|
||||||
if (!isCanceled()) {
|
if (!isCanceled()) {
|
||||||
|
@ -2196,12 +2231,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
executor.submit(new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
stack.getFrameData(fTargetFrameContext, request);
|
|
||||||
}});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addressSizeChanged(int addressSize) {
|
private void addressSizeChanged(int addressSize) {
|
||||||
|
@ -2722,9 +2752,32 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
fRulerContextMenuListeners.remove(listener);
|
fRulerContextMenuListeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSuspended(IExecutionDMContext 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);
|
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() {
|
private IRunControl getRunControl() {
|
||||||
return getService(IRunControl.class);
|
return getService(IRunControl.class);
|
||||||
|
@ -3280,12 +3333,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
} catch (BadLocationException e) {
|
} catch (BadLocationException e) {
|
||||||
// should not happen, but its safe to ignore anyway
|
// should not happen, but its safe to ignore anyway
|
||||||
}
|
}
|
||||||
boolean lineBreakpoint = srcPos != null && srcPos.length > 0;
|
|
||||||
|
|
||||||
IResource resource;
|
IResource resource;
|
||||||
ICBreakpoint bp;
|
ICBreakpoint bp;
|
||||||
|
|
||||||
if (lineBreakpoint) {
|
if (srcPos != null && srcPos.length > 0) {
|
||||||
SourceFileInfo srcInfo = srcPos.fFileInfo;
|
SourceFileInfo srcInfo = srcPos.fFileInfo;
|
||||||
String filePath = null;
|
String filePath = null;
|
||||||
resource = (IResource)srcInfo.fFile.getAdapter(IResource.class);
|
resource = (IResource)srcInfo.fFile.getAdapter(IResource.class);
|
||||||
|
@ -3305,11 +3357,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
if (pos instanceof DisassemblyPosition) {
|
if (pos instanceof DisassemblyPosition) {
|
||||||
srcLine = ((DisassemblyPosition)pos).getLine();
|
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 {
|
} else {
|
||||||
resource = ResourcesPlugin.getWorkspace().getRoot();
|
resource = ResourcesPlugin.getWorkspace().getRoot();
|
||||||
BigInteger address = getAddressOfLine(line);
|
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;
|
return bp;
|
||||||
|
@ -3320,7 +3372,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
if (fFile2Storage.containsKey(file)) {
|
if (fFile2Storage.containsKey(file)) {
|
||||||
sourceElement = fFile2Storage.get(file);
|
sourceElement = fFile2Storage.get(file);
|
||||||
} else {
|
} else {
|
||||||
final ISourceLookup lookup= getService(ISourceLookup.class);
|
|
||||||
final ISourceLookupDMContext ctx= DMContexts.getAncestorOfType(fTargetContext, ISourceLookupDMContext.class);
|
final ISourceLookupDMContext ctx= DMContexts.getAncestorOfType(fTargetContext, ISourceLookupDMContext.class);
|
||||||
final DsfExecutor executor= getSession().getExecutor();
|
final DsfExecutor executor= getSession().getExecutor();
|
||||||
Query<Object> query= new Query<Object>() {
|
Query<Object> query= new Query<Object>() {
|
||||||
|
@ -3333,6 +3384,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
|
||||||
rm.done();
|
rm.done();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
final ISourceLookup lookup= getService(ISourceLookup.class);
|
||||||
lookup.getSource(ctx, file, request);
|
lookup.getSource(ctx, file, request);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* 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.DataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
|
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.Query;
|
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.AddressRangePosition;
|
||||||
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyDocument;
|
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyDocument;
|
||||||
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyPosition;
|
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.internal.ui.disassembly.model.SourcePosition;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IExpressions;
|
import org.eclipse.cdt.dsf.debug.service.IExpressions;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
|
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.IExpressions.IExpressionDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
|
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.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.debug.service.IStack.IFrameDMContext;
|
||||||
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
|
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
|
||||||
import org.eclipse.cdt.internal.ui.text.CWordFinder;
|
import org.eclipse.cdt.internal.ui.text.CWordFinder;
|
||||||
|
@ -108,21 +111,28 @@ public class DisassemblyTextHover implements ITextHover {
|
||||||
* @param expr
|
* @param expr
|
||||||
* @return expression value or <code>null</code>
|
* @return expression value or <code>null</code>
|
||||||
*/
|
*/
|
||||||
private String evaluateExpression(String expr) {
|
private String evaluateExpression(final String expr) {
|
||||||
final IExpressions expressions= fDisassemblyPart.getService(IExpressions.class);
|
|
||||||
if (expressions == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
final IFrameDMContext frameDmc= fDisassemblyPart.getTargetFrameContext();
|
final IFrameDMContext frameDmc= fDisassemblyPart.getTargetFrameContext();
|
||||||
if (frameDmc == null || !fDisassemblyPart.isSuspended()) {
|
if (frameDmc == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
IExpressionDMContext exprDmc= expressions.createExpression(frameDmc, expr);
|
|
||||||
final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT);
|
|
||||||
final DsfExecutor executor= fDisassemblyPart.getSession().getExecutor();
|
final DsfExecutor executor= fDisassemblyPart.getSession().getExecutor();
|
||||||
Query<FormattedValueDMData> query= new Query<FormattedValueDMData>() {
|
Query<FormattedValueDMData> query= new Query<FormattedValueDMData>() {
|
||||||
@Override
|
@Override
|
||||||
protected void execute(final DataRequestMonitor<FormattedValueDMData> rm) {
|
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) {
|
expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor<FormattedValueDMData>(executor, rm) {
|
||||||
@Override
|
@Override
|
||||||
protected void handleSuccess() {
|
protected void handleSuccess() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue