mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-17 05:55:22 +02:00
Defect 249382.
This commit is contained in:
parent
2314ae3421
commit
b3195b5c3d
1 changed files with 159 additions and 78 deletions
|
@ -10,15 +10,18 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register;
|
package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.RejectedExecutionException;
|
import java.util.concurrent.RejectedExecutionException;
|
||||||
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
|
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
|
||||||
|
import org.eclipse.dd.dsf.concurrent.DsfExecutor;
|
||||||
import org.eclipse.dd.dsf.concurrent.DsfRunnable;
|
import org.eclipse.dd.dsf.concurrent.DsfRunnable;
|
||||||
import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants;
|
import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants;
|
||||||
import org.eclipse.dd.dsf.concurrent.ImmediateExecutor;
|
import org.eclipse.dd.dsf.concurrent.ImmediateExecutor;
|
||||||
|
import org.eclipse.dd.dsf.concurrent.MultiRequestMonitor;
|
||||||
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
|
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
|
||||||
import org.eclipse.dd.dsf.datamodel.DMContexts;
|
import org.eclipse.dd.dsf.datamodel.DMContexts;
|
||||||
import org.eclipse.dd.dsf.datamodel.IDMContext;
|
import org.eclipse.dd.dsf.datamodel.IDMContext;
|
||||||
|
@ -175,16 +178,95 @@ public class RegisterVMNode extends AbstractExpressionVMNode
|
||||||
return fRegisterExpressionFactory;
|
return fRegisterExpressionFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This class is used to hold the associated information needed to finally get the
|
||||||
|
* formatted value for a register DMC. It starts out with the basic set sans the
|
||||||
|
* actual formatted register DMC. Once found this is added to the information.
|
||||||
|
*/
|
||||||
|
private class QueuedValueUpdate {
|
||||||
|
|
||||||
|
ILabelUpdate fUpdate;
|
||||||
|
int fIndex ;
|
||||||
|
IRegisterDMContext fDmc;
|
||||||
|
FormattedValueDMContext fValueDmc = null;
|
||||||
|
|
||||||
|
public QueuedValueUpdate( ILabelUpdate update, int index , IRegisterDMContext dmc ) {
|
||||||
|
fUpdate = update;
|
||||||
|
fIndex = index;
|
||||||
|
fDmc = dmc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILabelUpdate getUpdate() { return fUpdate; }
|
||||||
|
public int getIndex() { return fIndex; }
|
||||||
|
public IRegisterDMContext getDmc() { return fDmc; }
|
||||||
|
|
||||||
|
public void setValueDmc( FormattedValueDMContext dmc ) { fValueDmc = dmc; }
|
||||||
|
public FormattedValueDMContext getValueDmc() { return fValueDmc; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private void retrieveAllFormattedDataValues( final ArrayList<QueuedValueUpdate> updates ) {
|
||||||
|
|
||||||
|
final IRegisters regService = getServicesTracker().getService(IRegisters.class);
|
||||||
|
if ( regService == null ) {
|
||||||
|
for ( final QueuedValueUpdate up : updates ) {
|
||||||
|
handleFailedUpdate(up.getUpdate());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( final QueuedValueUpdate up : updates ) {
|
||||||
|
|
||||||
|
final ILabelUpdate update = up.getUpdate();
|
||||||
|
final int idx = up.getIndex();
|
||||||
|
final FormattedValueDMContext valueDmc = up.getValueDmc();
|
||||||
|
|
||||||
|
getDMVMProvider().getModelData(
|
||||||
|
RegisterVMNode.this,
|
||||||
|
update,
|
||||||
|
regService,
|
||||||
|
valueDmc,
|
||||||
|
new ViewerDataRequestMonitor<FormattedValueDMData>(getSession().getExecutor(), update) {
|
||||||
|
@Override
|
||||||
|
public void handleCompleted() {
|
||||||
|
if (!isSuccess()) {
|
||||||
|
if (getStatus().getCode() == IDsfStatusConstants.INVALID_STATE) {
|
||||||
|
update.setLabel("...", idx); //$NON-NLS-1$
|
||||||
|
} else {
|
||||||
|
update.setLabel("Error: " + getStatus().getMessage(), idx); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
update.setFontData(JFaceResources.getFontDescriptor(IInternalDebugUIConstants.VARIABLE_TEXT_FONT).getFontData()[0], idx);
|
||||||
|
update.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Fill the label/column with the properly formatted data value.
|
||||||
|
*/
|
||||||
|
update.setLabel(getData().getFormattedValue(), idx);
|
||||||
|
|
||||||
|
// color based on change history
|
||||||
|
FormattedValueDMData oldData = (FormattedValueDMData) getDMVMProvider().getArchivedModelData(RegisterVMNode.this, update, valueDmc);
|
||||||
|
if(oldData != null && !oldData.getFormattedValue().equals(getData().getFormattedValue())) {
|
||||||
|
update.setBackground(DebugUIPlugin.getPreferenceColor(IInternalDebugUIConstants.PREF_CHANGED_VALUE_BACKGROUND).getRGB(), idx);
|
||||||
|
}
|
||||||
|
update.setFontData(JFaceResources.getFontDescriptor(IInternalDebugUIConstants.VARIABLE_TEXT_FONT).getFontData()[0], idx);
|
||||||
|
update.done();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getSession().getExecutor()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data access routine which performs the extra level of data access needed to
|
* Private data access routine which performs the extra level of data access needed to
|
||||||
* get the formatted data value for a specific register.
|
* get the formatted data value for a specific register.
|
||||||
*/
|
*/
|
||||||
private void updateFormattedRegisterValue(final ILabelUpdate update, final int labelIndex, final IRegisterDMContext dmc)
|
private void getFormattedDmcForReqister( final ILabelUpdate update, final IRegisterDMContext dmc, final DataRequestMonitor<FormattedValueDMContext> rm)
|
||||||
{
|
{
|
||||||
final IRegisters regService = getServicesTracker().getService(IRegisters.class);
|
final IRegisters regService = getServicesTracker().getService(IRegisters.class);
|
||||||
|
|
||||||
if ( regService == null ) {
|
if ( regService == null ) {
|
||||||
handleFailedUpdate(update);
|
rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "", null)); //$NON-NLS-1$
|
||||||
|
rm.done();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,20 +275,14 @@ public class RegisterVMNode extends AbstractExpressionVMNode
|
||||||
* page format is supported by the register service. If the format is not supported then
|
* page format is supported by the register service. If the format is not supported then
|
||||||
* we will pick the first available format.
|
* we will pick the first available format.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
final IPresentationContext context = update.getPresentationContext();
|
final IPresentationContext context = update.getPresentationContext();
|
||||||
final String preferencePageFormatId = fFormattedPrefStore.getCurrentNumericFormat(context) ;
|
final String preferencePageFormatId = getPreferenceStore().getCurrentNumericFormat(context) ;
|
||||||
|
|
||||||
regService.getAvailableFormats(
|
regService.getAvailableFormats(
|
||||||
dmc,
|
dmc,
|
||||||
new ViewerDataRequestMonitor<String[]>(getSession().getExecutor(), update) {
|
new DataRequestMonitor<String[]>(getSession().getExecutor(), rm) {
|
||||||
@Override
|
@Override
|
||||||
public void handleCompleted() {
|
public void handleSuccess() {
|
||||||
if (!isSuccess()) {
|
|
||||||
handleFailedUpdate(update);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See if the desired format is supported.
|
* See if the desired format is supported.
|
||||||
*/
|
*/
|
||||||
|
@ -237,50 +313,16 @@ public class RegisterVMNode extends AbstractExpressionVMNode
|
||||||
/*
|
/*
|
||||||
* Register service does not support any format.
|
* Register service does not support any format.
|
||||||
*/
|
*/
|
||||||
handleFailedUpdate(update);
|
handleFailure();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Format has been validated. Get the formatted value.
|
* Format has been validated. Return it.
|
||||||
*/
|
*/
|
||||||
final FormattedValueDMContext valueDmc = regService.getFormattedValueContext(dmc, finalFormatId);
|
rm.setData(regService.getFormattedValueContext(dmc, finalFormatId));
|
||||||
|
rm.done();
|
||||||
getDMVMProvider().getModelData(
|
|
||||||
RegisterVMNode.this, update, regService, valueDmc,
|
|
||||||
new ViewerDataRequestMonitor<FormattedValueDMData>(getSession().getExecutor(), update) {
|
|
||||||
@Override
|
|
||||||
public void handleCompleted() {
|
|
||||||
if (!isSuccess()) {
|
|
||||||
if (getStatus().getCode() == IDsfStatusConstants.INVALID_STATE) {
|
|
||||||
update.setLabel("...", labelIndex); //$NON-NLS-1$
|
|
||||||
} else {
|
|
||||||
update.setLabel("Error: " + getStatus().getMessage(), labelIndex); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
update.setFontData(JFaceResources.getFontDescriptor(IInternalDebugUIConstants.VARIABLE_TEXT_FONT).getFontData()[0], labelIndex);
|
|
||||||
update.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Fill the label/column with the properly formatted data value.
|
|
||||||
*/
|
|
||||||
update.setLabel(getData().getFormattedValue(), labelIndex);
|
|
||||||
|
|
||||||
// color based on change history
|
|
||||||
|
|
||||||
FormattedValueDMData oldData = (FormattedValueDMData) getDMVMProvider().getArchivedModelData(
|
|
||||||
RegisterVMNode.this, update, valueDmc);
|
|
||||||
if(oldData != null && !oldData.getFormattedValue().equals(getData().getFormattedValue())) {
|
|
||||||
update.setBackground(
|
|
||||||
DebugUIPlugin.getPreferenceColor(IInternalDebugUIConstants.PREF_CHANGED_VALUE_BACKGROUND).getRGB(), labelIndex);
|
|
||||||
}
|
|
||||||
update.setFontData(JFaceResources.getFontDescriptor(IInternalDebugUIConstants.VARIABLE_TEXT_FONT).getFontData()[0], labelIndex);
|
|
||||||
update.done();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getSession().getExecutor()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -290,7 +332,6 @@ public class RegisterVMNode extends AbstractExpressionVMNode
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider#update(org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate[])
|
* @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider#update(org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate[])
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public void update(final ILabelUpdate[] updates) {
|
public void update(final ILabelUpdate[] updates) {
|
||||||
try {
|
try {
|
||||||
getSession().getExecutor().execute(new DsfRunnable() {
|
getSession().getExecutor().execute(new DsfRunnable() {
|
||||||
|
@ -303,11 +344,42 @@ public class RegisterVMNode extends AbstractExpressionVMNode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Updates the labels which are controlled by the column being requested.
|
* Updates the labels which are controlled by the column being requested.
|
||||||
*/
|
*/
|
||||||
protected void updateLabelInSessionThread(ILabelUpdate[] updates) {
|
protected void updateLabelInSessionThread(final ILabelUpdate[] updates) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This list represents all the QUEUED requests for formatted DMCs. This allows us to issue the
|
||||||
|
* requests for the data in the same dispatch cycle. Thus the lower level services is given its
|
||||||
|
* best chance to coalesce the registers in to a single request.
|
||||||
|
*/
|
||||||
|
final ArrayList<QueuedValueUpdate> valueUpdatesToProcess = new ArrayList<QueuedValueUpdate>();
|
||||||
|
|
||||||
|
final DsfExecutor dsfExecutor = getSession().getExecutor();
|
||||||
|
final MultiRequestMonitor<RequestMonitor> mrm =
|
||||||
|
new MultiRequestMonitor<RequestMonitor>(dsfExecutor, null) {
|
||||||
|
@Override
|
||||||
|
public void handleCompleted() {
|
||||||
|
if (!isSuccess()) {
|
||||||
|
for ( ILabelUpdate up : updates ) {
|
||||||
|
handleFailedUpdate(up);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We have all of the formatted DMCs. Go issue the requests for the formatted data
|
||||||
|
* in a single dispatch cycle.
|
||||||
|
*/
|
||||||
|
retrieveAllFormattedDataValues( valueUpdatesToProcess );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* Process each update request, creating a QUEUE of requests which need further processing
|
||||||
|
* for the formatted values.
|
||||||
|
*/
|
||||||
for (final ILabelUpdate update : updates) {
|
for (final ILabelUpdate update : updates) {
|
||||||
|
|
||||||
final IRegisterDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IRegisterDMContext.class);
|
final IRegisterDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IRegisterDMContext.class);
|
||||||
|
@ -322,7 +394,6 @@ public class RegisterVMNode extends AbstractExpressionVMNode
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
getDMVMProvider().getModelData(
|
getDMVMProvider().getModelData(
|
||||||
this,
|
this,
|
||||||
update,
|
update,
|
||||||
|
@ -389,18 +460,15 @@ public class RegisterVMNode extends AbstractExpressionVMNode
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If columns are configured, extract the selected values for each
|
* If columns are configured, extract the selected values for each understood column. First we fill all
|
||||||
* understood column. First we fill all of those columns which can
|
* of those columns which can be filled without the extra data mining. We also note, if we do have to
|
||||||
* be filled without the extra data mining. We also note if we do
|
* datamine. Any columns need to set the processing flag so we know we have further work to do. If there
|
||||||
* have to datamine. Any columns need to set the processing flag
|
* are more columns which need data extraction they need to be added in both "for" loops.
|
||||||
* so we know we have further work to do. If there are more columns
|
|
||||||
* which need data extraction they need to be added in both "for"
|
|
||||||
* loops.
|
|
||||||
*/
|
*/
|
||||||
String[] localColumns = update.getColumnIds();
|
String[] localColumns = update.getColumnIds();
|
||||||
if (localColumns == null) localColumns = new String[] { IDebugVMConstants.COLUMN_ID__NAME };
|
if (localColumns == null) localColumns = new String[] { IDebugVMConstants.COLUMN_ID__NAME };
|
||||||
|
|
||||||
boolean weAreExtractingFormattedData = false;
|
boolean allFieldsProcessed = true;
|
||||||
|
|
||||||
for (int idx = 0; idx < localColumns.length; idx++) {
|
for (int idx = 0; idx < localColumns.length; idx++) {
|
||||||
update.setFontData(JFaceResources.getFontDescriptor(IInternalDebugUIConstants.VARIABLE_TEXT_FONT).getFontData()[0], idx);
|
update.setFontData(JFaceResources.getFontDescriptor(IInternalDebugUIConstants.VARIABLE_TEXT_FONT).getFontData()[0], idx);
|
||||||
|
@ -408,7 +476,28 @@ public class RegisterVMNode extends AbstractExpressionVMNode
|
||||||
update.setLabel(getData().getName(), idx);
|
update.setLabel(getData().getName(), idx);
|
||||||
update.setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_OBJS_REGISTER), idx);
|
update.setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_OBJS_REGISTER), idx);
|
||||||
} else if (IDebugVMConstants.COLUMN_ID__VALUE.equals(localColumns[idx])) {
|
} else if (IDebugVMConstants.COLUMN_ID__VALUE.equals(localColumns[idx])) {
|
||||||
weAreExtractingFormattedData = true;
|
allFieldsProcessed = false;
|
||||||
|
/*
|
||||||
|
* Create an entry which holds all related data and add it to the list to process
|
||||||
|
* when all the formatted DMCs are gathered.
|
||||||
|
*/
|
||||||
|
final QueuedValueUpdate valueUpdate = new QueuedValueUpdate(update,idx,dmc);
|
||||||
|
valueUpdatesToProcess.add(valueUpdate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fetch the associated formatted DMC for this field. This is added to the multi-request
|
||||||
|
* monitor so they can all be gathered and processed in a single set.
|
||||||
|
*/
|
||||||
|
DataRequestMonitor<FormattedValueDMContext> rm = new DataRequestMonitor<FormattedValueDMContext>(dsfExecutor, null) {
|
||||||
|
@Override
|
||||||
|
public void handleCompleted() {
|
||||||
|
valueUpdate.setValueDmc(getData());
|
||||||
|
mrm.requestMonitorDone(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
mrm.add(rm);
|
||||||
|
getFormattedDmcForReqister(update, dmc, rm);
|
||||||
} else if (IDebugVMConstants.COLUMN_ID__TYPE.equals(localColumns[idx])) {
|
} else if (IDebugVMConstants.COLUMN_ID__TYPE.equals(localColumns[idx])) {
|
||||||
IRegisterDMData data = getData();
|
IRegisterDMData data = getData();
|
||||||
String typeStr = "Unsigned"; //$NON-NLS-1$
|
String typeStr = "Unsigned"; //$NON-NLS-1$
|
||||||
|
@ -438,27 +527,19 @@ public class RegisterVMNode extends AbstractExpressionVMNode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! weAreExtractingFormattedData ) {
|
if ( allFieldsProcessed ) {
|
||||||
update.done();
|
update.done();
|
||||||
} else {
|
}
|
||||||
boolean found = false;
|
|
||||||
for (int idx = 0; idx < localColumns.length; idx++) {
|
|
||||||
if (IDebugVMConstants.COLUMN_ID__VALUE.equals(localColumns[idx])) {
|
|
||||||
found = true;
|
|
||||||
updateFormattedRegisterValue(update, idx, dmc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
update.done();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getSession().getExecutor());
|
getSession().getExecutor());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode#update(org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate[])
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void update(IHasChildrenUpdate[] updates) {
|
public void update(IHasChildrenUpdate[] updates) {
|
||||||
// As an optimization, always indicate that register groups have
|
// As an optimization, always indicate that register groups have
|
||||||
|
|
Loading…
Add table
Reference in a new issue