From deabab9f21be768d1a03187f6c40ecc90e5431c6 Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Mon, 31 Mar 2008 17:00:28 +0000 Subject: [PATCH] [216803] Removed the getName() methos from Data Model contexts declared in IRegisters service interface. --- .../register/RegisterBitFieldVMNode.java | 66 +- .../register/RegisterGroupVMNode.java | 43 +- .../ui/viewmodel/register/RegisterVMNode.java | 54 +- .../register/SyncRegisterDataAccess.java | 581 ++++++++---------- .../dd/dsf/debug/service/IRegisters.java | 3 - .../eclipse/dd/tests/gdb/MIRegistersTest.java | 51 +- 6 files changed, 404 insertions(+), 394 deletions(-) diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterBitFieldVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterBitFieldVMNode.java index 1911cec30cd..90a40f5cc44 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterBitFieldVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterBitFieldVMNode.java @@ -18,6 +18,7 @@ import org.eclipse.core.runtime.Status; import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.DMContexts; import org.eclipse.dd.dsf.datamodel.IDMContext; @@ -32,7 +33,8 @@ import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IBitFieldDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IMnemonic; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext; -import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMContext; +import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMData; +import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData; import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent; import org.eclipse.dd.dsf.debug.ui.viewmodel.IDebugVMConstants; import org.eclipse.dd.dsf.debug.ui.viewmodel.expression.AbstractExpressionVMNode; @@ -116,32 +118,22 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode } public String createWatchExpression(Object element) throws CoreException { - BitFieldVMC bitFieldVmc = ((BitFieldVMC)element); + IRegisterGroupDMData groupData = fDataAccess.getRegisterGroupDMData(element); + IRegisterDMData registerData = fDataAccess.getRegisterDMData(element); + IBitFieldDMData bitFieldData = fDataAccess.getBitFieldDMData(element); - StringBuffer exprBuf = new StringBuffer(); - IRegisterGroupDMContext groupDmc = - DMContexts.getAncestorOfType(bitFieldVmc.getDMContext(), IRegisterGroupDMContext.class); - if (groupDmc != null) { + if (groupData != null && registerData != null && bitFieldData != null) { + StringBuffer exprBuf = new StringBuffer(); exprBuf.append("$$\""); //$NON-NLS-1$ - exprBuf.append(groupDmc.getName()); + exprBuf.append(groupData.getName()); exprBuf.append('"'); - } - - IRegisterDMContext registerDmc = - DMContexts.getAncestorOfType(bitFieldVmc.getDMContext(), IRegisterDMContext.class); - if (registerDmc != null) { exprBuf.append('$'); - exprBuf.append(registerDmc.getName()); - } - - IBitFieldDMContext bitFieldDmc = - DMContexts.getAncestorOfType(bitFieldVmc.getDMContext(), IBitFieldDMContext.class); - if (bitFieldDmc != null) { + exprBuf.append(registerData.getName()); exprBuf.append('.'); - exprBuf.append(bitFieldDmc.getName()); + exprBuf.append(bitFieldData.getName()); + return exprBuf.toString(); } - - return exprBuf.toString(); + return null; } } @@ -512,7 +504,7 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode } @Override - protected void testElementForExpression(Object element, IExpression expression, DataRequestMonitor rm) { + protected void testElementForExpression(Object element, IExpression expression, final DataRequestMonitor rm) { if (!(element instanceof IDMVMContext)) { rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_HANDLE, "Invalid context", null)); //$NON-NLS-1$ rm.done(); @@ -526,13 +518,31 @@ public class RegisterBitFieldVMNode extends AbstractExpressionVMNode return; } - String bitFieldName = parseExpressionForBitFieldName(expression.getExpressionText()); - if (dmc.getName().equals(bitFieldName)) { - rm.setData(Boolean.TRUE); - } else { - rm.setData(Boolean.FALSE); + final String bitFieldName = parseExpressionForBitFieldName(expression.getExpressionText()); + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + IRegisters registersService = getServicesTracker().getService(IRegisters.class); + if (registersService != null) { + registersService.getBitFieldData( + dmc, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + rm.setData( getData().getName().equals(bitFieldName) ); + rm.done(); + } + }); + } else { + rm.setStatus(new Status(IStatus.WARNING, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Register service not available", null)); //$NON-NLS-1$ + rm.done(); + } + } + }); + } catch (RejectedExecutionException e) { + rm.setStatus(new Status(IStatus.WARNING, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "DSF session shut down", null)); //$NON-NLS-1$ + rm.done(); } - rm.done(); } public boolean canParseExpression(IExpression expression) { diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterGroupVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterGroupVMNode.java index afed1987537..0e98c9951c7 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterGroupVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterGroupVMNode.java @@ -18,6 +18,7 @@ import org.eclipse.core.runtime.Status; import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.DMContexts; import org.eclipse.dd.dsf.datamodel.IDMContext; @@ -102,13 +103,11 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode } public String createWatchExpression(Object element) throws CoreException { - RegisterGroupVMC registerVmc = ((RegisterGroupVMC)element); - - StringBuffer exprBuf = new StringBuffer(); - IRegisterGroupDMContext groupDmc = DMContexts.getAncestorOfType(registerVmc.getDMContext(), IRegisterGroupDMContext.class); - if (groupDmc != null) { + IRegisterGroupDMData groupData = fSyncRegisterDataAccess.getRegisterGroupDMData(element); + if (groupData != null) { + StringBuffer exprBuf = new StringBuffer(); exprBuf.append("$$\""); //$NON-NLS-1$ - exprBuf.append(groupDmc.getName()); + exprBuf.append(groupData.getName()); exprBuf.append('"'); return exprBuf.toString(); } @@ -328,7 +327,7 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode } @Override - protected void testElementForExpression(Object element, IExpression expression, DataRequestMonitor rm) { + protected void testElementForExpression(Object element, IExpression expression, final DataRequestMonitor rm) { if (!(element instanceof IDMVMContext)) { rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_HANDLE, "Invalid context", null)); //$NON-NLS-1$ rm.done(); @@ -341,13 +340,31 @@ public class RegisterGroupVMNode extends AbstractExpressionVMNode return; } - String groupName = parseExpressionForGroupName(expression.getExpressionText()); - if (dmc.getName().equals(groupName)) { - rm.setData(Boolean.TRUE); - } else { - rm.setData(Boolean.FALSE); + final String groupName = parseExpressionForGroupName(expression.getExpressionText()); + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + IRegisters registersService = getServicesTracker().getService(IRegisters.class); + if (registersService != null) { + registersService.getRegisterGroupData( + dmc, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + rm.setData( getData().getName().equals(groupName) ); + rm.done(); + } + }); + } else { + rm.setStatus(new Status(IStatus.WARNING, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Register service not available", null)); //$NON-NLS-1$ + rm.done(); + } + } + }); + } catch (RejectedExecutionException e) { + rm.setStatus(new Status(IStatus.WARNING, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "DSF session shut down", null)); //$NON-NLS-1$ + rm.done(); } - rm.done(); } @Override diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterVMNode.java index bdabd600730..3c4f6d587ce 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterVMNode.java @@ -18,6 +18,7 @@ import org.eclipse.core.runtime.Status; import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.DMContexts; import org.eclipse.dd.dsf.datamodel.IDMContext; @@ -30,7 +31,7 @@ import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterChangedDMEvent; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMData; -import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMContext; +import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData; import org.eclipse.dd.dsf.debug.ui.viewmodel.IDebugVMConstants; import org.eclipse.dd.dsf.debug.ui.viewmodel.expression.AbstractExpressionVMNode; import org.eclipse.dd.dsf.debug.ui.viewmodel.numberformat.IFormattedValuePreferenceStore; @@ -114,22 +115,15 @@ public class RegisterVMNode extends AbstractExpressionVMNode } public String createWatchExpression(Object element) throws CoreException { - RegisterVMC registerVmc = ((RegisterVMC)element); - - StringBuffer exprBuf = new StringBuffer(); - IRegisterGroupDMContext groupDmc = - DMContexts.getAncestorOfType(registerVmc.getDMContext(), IRegisterGroupDMContext.class); - if (groupDmc != null) { + IRegisterGroupDMData groupData = fSyncRegisterDataAccess.getRegisterGroupDMData(element); + IRegisterDMData registerData = fSyncRegisterDataAccess.getRegisterDMData(element); + if (groupData != null && registerData != null) { + StringBuffer exprBuf = new StringBuffer(); exprBuf.append("$$\""); //$NON-NLS-1$ - exprBuf.append(groupDmc.getName()); + exprBuf.append(groupData.getName()); exprBuf.append('"'); - } - - IRegisterDMContext registerDmc = - DMContexts.getAncestorOfType(registerVmc.getDMContext(), IRegisterDMContext.class); - if (registerDmc != null) { exprBuf.append('$'); - exprBuf.append(registerDmc.getName()); + exprBuf.append(registerData.getName()); return exprBuf.toString(); } @@ -485,7 +479,7 @@ public class RegisterVMNode extends AbstractExpressionVMNode } @Override - protected void testElementForExpression(Object element, IExpression expression, DataRequestMonitor rm) { + protected void testElementForExpression(Object element, IExpression expression, final DataRequestMonitor rm) { if (!(element instanceof IDMVMContext)) { rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_HANDLE, "Invalid context", null)); //$NON-NLS-1$ rm.done(); @@ -498,13 +492,31 @@ public class RegisterVMNode extends AbstractExpressionVMNode return; } - String regName = parseExpressionForRegisterName(expression.getExpressionText()); - if (dmc.getName().equals(regName)) { - rm.setData(Boolean.TRUE); - } else { - rm.setData(Boolean.FALSE); + final String regName = parseExpressionForRegisterName(expression.getExpressionText()); + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + IRegisters registersService = getServicesTracker().getService(IRegisters.class); + if (registersService != null) { + registersService.getRegisterData( + dmc, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + rm.setData( getData().getName().equals(regName) ); + rm.done(); + } + }); + } else { + rm.setStatus(new Status(IStatus.WARNING, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Register service not available", null)); //$NON-NLS-1$ + rm.done(); + } + } + }); + } catch (RejectedExecutionException e) { + rm.setStatus(new Status(IStatus.WARNING, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "DSF session shut down", null)); //$NON-NLS-1$ + rm.done(); } - rm.done(); } @Override diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/SyncRegisterDataAccess.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/SyncRegisterDataAccess.java index 791dc864936..d9d4f883fb4 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/SyncRegisterDataAccess.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/SyncRegisterDataAccess.java @@ -17,6 +17,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; import org.eclipse.dd.dsf.concurrent.Query; import org.eclipse.dd.dsf.concurrent.ThreadSafe; import org.eclipse.dd.dsf.concurrent.ThreadSafeAndProhibitedFromDsfExecutor; @@ -43,6 +44,45 @@ import org.osgi.util.tracker.ServiceTracker; @ThreadSafeAndProhibitedFromDsfExecutor("fSession#getExecutor") public class SyncRegisterDataAccess { + abstract public class RegistersServiceQuery extends Query { + + final protected K fDmc; + + public RegistersServiceQuery(K dmc) { + fDmc = dmc; + } + + @Override + protected void execute(final DataRequestMonitor rm) { + /* + * We're in another dispatch, so we must guard against executor + * shutdown again. + */ + final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); + if (session == null) { + cancel(false); + rm.done(); + return; + } + + /* + * Guard against a disposed service + */ + IRegisters service = getService(); + if (service == null) { + rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, + "Service unavailable", null)); //$NON-NLS-1$ + rm.done(); + return; + } + + doExecute(service, rm); + } + + abstract protected void doExecute(IRegisters registersService, DataRequestMonitor rm); + } + + /** * The session that this data access operates in. */ @@ -83,48 +123,26 @@ public class SyncRegisterDataAccess { } } - public class GetBitFieldValueQuery extends Query { - - private IBitFieldDMContext fDmc; + public class GetBitFieldValueQuery extends RegistersServiceQuery { public GetBitFieldValueQuery(IBitFieldDMContext dmc) { - super(); - fDmc = dmc; + super(dmc); } @Override - protected void execute(final DataRequestMonitor rm) { - /* - * Guard agains the session being disposed. If session is disposed - * it could mean that the executor is shut-down, which in turn could - * mean that we can't complete the RequestMonitor argument. in that - * case, cancel to notify waiting thread. - */ - final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); - if (session == null) { - cancel(false); - rm.done(); - return; - } - - IRegisters service = getService(); - if (service == null) { - rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, - "Service not available", null)); //$NON-NLS-1$ - rm.done(); - return; - } - - service.getBitFieldData(fDmc, new DataRequestMonitor(session.getExecutor(), rm) { - @Override - protected void handleSuccess() { - /* - * All good set return value. - */ - rm.setData(getData()); - rm.done(); - } - }); + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { + service.getBitFieldData( + fDmc, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + /* + * All good set return value. + */ + rm.setData(getData()); + rm.done(); + } + }); } } @@ -171,59 +189,32 @@ public class SyncRegisterDataAccess { } } - public class SetBitFieldValueQuery extends Query { - - private IBitFieldDMContext fDmc; + public class SetBitFieldValueQuery extends RegistersServiceQuery { private String fValue; - private String fFormatId; public SetBitFieldValueQuery(IBitFieldDMContext dmc, String value, String formatId) { - super(); - fDmc = dmc; + super(dmc); fValue = value; fFormatId = formatId; } @Override - protected void execute(final DataRequestMonitor rm) { - /* - * We're in another dispatch, so we must guard against executor - * shutdown again. - */ - final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); - if (session == null) { - cancel(false); - rm.done(); - return; - } - - /* - * Guard against a disposed service - */ - IRegisters service = getService(); - if (service == null) { - rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, - "Service unavailable", null)); //$NON-NLS-1$ - rm.done(); - return; - } - - /* - * Write the bit field using a string/format style. - */ - service.writeBitField(fDmc, fValue, fFormatId, new DataRequestMonitor(session - .getExecutor(), rm) { - @Override - protected void handleSuccess() { - /* - * All good set return value. - */ - rm.setData(new Object()); - rm.done(); - } - }); + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { + // Write the bit field using a string/format style. + service.writeBitField( + fDmc, fValue, fFormatId, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + /* + * All good set return value. + */ + rm.setData(new Object()); + rm.done(); + } + }); } } @@ -269,55 +260,29 @@ public class SyncRegisterDataAccess { } } - public class SetBitFieldValueMnemonicQuery extends Query { - - IBitFieldDMContext fDmc; - + public class SetBitFieldValueMnemonicQuery extends RegistersServiceQuery { IMnemonic fMnemonic; public SetBitFieldValueMnemonicQuery(IBitFieldDMContext dmc, IMnemonic mnemonic) { - super(); - fDmc = dmc; + super(dmc); fMnemonic = mnemonic; } @Override - protected void execute(final DataRequestMonitor rm) { - /* - * We're in another dispatch, so we must guard against executor - * shutdown again. - */ - final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); - if (session == null) { - cancel(false); - rm.done(); - return; - } - - /* - * Guard against a disposed service - */ - IRegisters service = getService(); - if (service == null) { - rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, - "Service unavailable", null)); //$NON-NLS-1$ - rm.done(); - return; - } - - /* - * Write the bit field using the mnemonic style. - */ - service.writeBitField(fDmc, fMnemonic, new DataRequestMonitor(session.getExecutor(), rm) { - @Override - protected void handleSuccess() { - /* - * All good set return value. - */ - rm.setData(new Object()); - rm.done(); - } - }); + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { + // Write the bit field using the mnemonic style. + service.writeBitField( + fDmc, fMnemonic, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + /* + * All good set return value. + */ + rm.setData(new Object()); + rm.done(); + } + }); } } @@ -387,48 +352,25 @@ public class SyncRegisterDataAccess { return null; } - public class GetRegisterGroupValueQuery extends Query { - - IRegisterGroupDMContext fDmc; - + public class GetRegisterGroupValueQuery extends RegistersServiceQuery { public GetRegisterGroupValueQuery(IRegisterGroupDMContext dmc) { - super(); - fDmc = dmc; + super(dmc); } @Override - protected void execute(final DataRequestMonitor rm) { - /* - * Guard agains the session being disposed. If session is disposed - * it could mean that the executor is shut-down, which in turn could - * mean that we can't complete the RequestMonitor argument. in that - * case, cancel to notify waiting thread. - */ - final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); - if (session == null) { - cancel(false); - rm.done(); - return; - } - - IRegisters service = getService(); - if (service == null) { - rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, - "Service not available", null)); //$NON-NLS-1$ - rm.done(); - return; - } - - service.getRegisterGroupData(fDmc, new DataRequestMonitor(session.getExecutor(), rm) { - @Override - protected void handleSuccess() { - /* - * All good set return value. - */ - rm.setData(getData()); - rm.done(); - } - }); + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { + service.getRegisterGroupData( + fDmc, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + /* + * All good set return value. + */ + rm.setData(getData()); + rm.done(); + } + }); } } @@ -467,48 +409,25 @@ public class SyncRegisterDataAccess { } } - public class GetRegisterValueQuery extends Query { - - IRegisterDMContext fDmc; - + public class GetRegisterValueQuery extends RegistersServiceQuery { public GetRegisterValueQuery(IRegisterDMContext dmc) { - super(); - fDmc = dmc; + super(dmc); } @Override - protected void execute(final DataRequestMonitor rm) { - /* - * Guard agains the session being disposed. If session is disposed - * it could mean that the executor is shut-down, which in turn could - * mean that we can't complete the RequestMonitor argument. in that - * case, cancel to notify waiting thread. - */ - final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); - if (session == null) { - cancel(false); - rm.done(); - return; - } - - IRegisters service = getService(); - if (service == null) { - rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, - "Service not available", null)); //$NON-NLS-1$ - rm.done(); - return; - } - - service.getRegisterData(fDmc, new DataRequestMonitor(session.getExecutor(), rm) { - @Override - protected void handleSuccess() { - /* - * All good set return value. - */ - rm.setData(getData()); - rm.done(); - } - }); + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { + service.getRegisterData( + fDmc, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + /* + * All good set return value. + */ + rm.setData(getData()); + rm.done(); + } + }); } } @@ -547,63 +466,34 @@ public class SyncRegisterDataAccess { } } - public class SetRegisterValueQuery extends Query { - - private IRegisterDMContext fDmc; - + public class SetRegisterValueQuery extends RegistersServiceQuery { private String fValue; private String fFormatId; public SetRegisterValueQuery(IRegisterDMContext dmc, String value, String formatId) { - super(); - fDmc = dmc; + super(dmc); fValue = value; fFormatId = formatId; } @Override - protected void execute(final DataRequestMonitor rm) { - /* - * We're in another dispatch, so we must guard against executor - * shutdown again. - */ - final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); - if (session == null) { - cancel(false); - rm.done(); - return; - } - - /* - * Guard against a disposed service - */ - IRegisters service = getService(); - if (service == null) { - rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, - "Service unavailable", null)); //$NON-NLS-1$ - rm.done(); - return; - } - - /* - * The interface does not currently have a write function. It needs - * to and now would seem to be the time to add it. - */ + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { /* * Write the bit field using a string/format style. */ - service.writeRegister(fDmc, fValue, fFormatId, new DataRequestMonitor(session - .getExecutor(), rm) { - @Override - protected void handleSuccess() { - /* - * All good set return value. - */ - rm.setData(new Object()); - rm.done(); - } - }); + service.writeRegister( + fDmc, fValue, fFormatId, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + /* + * All good set return value. + */ + rm.setData(new Object()); + rm.done(); + } + }); } } @@ -648,52 +538,15 @@ public class SyncRegisterDataAccess { } } - public class GetSupportFormatsValueQuery extends Query { - - IFormattedDataDMContext fDmc; + public class GetSupportFormatsValueQuery extends RegistersServiceQuery { public GetSupportFormatsValueQuery(IFormattedDataDMContext dmc) { - super(); - fDmc = dmc; + super(dmc); } @Override - protected void execute(final DataRequestMonitor rm) { - /* - * We're in another dispatch, so we must guard against executor - * shutdown again. - */ - final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); - if (session == null) { - cancel(false); - rm.done(); - return; - } - - /* - * Guard against a disposed service - */ - IRegisters service = getService(); - if (service == null) { - rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, - "Service unavailable", null)); //$NON-NLS-1$ - rm.done(); - return; - } - - /* - * Write the bit field using a string/format style. - */ - service.getAvailableFormats(fDmc, new DataRequestMonitor(session.getExecutor(), rm) { - @Override - protected void handleSuccess() { - /* - * All good set return value. - */ - rm.setData(new Object()); - rm.done(); - } - }); + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { + service.getAvailableFormats(fDmc, rm); } } @@ -730,7 +583,7 @@ public class SyncRegisterDataAccess { * data. */ try { - return (String[]) query.get(); + return query.get(); } catch (InterruptedException e) { assert false; return null; @@ -739,42 +592,17 @@ public class SyncRegisterDataAccess { } } - public class GetFormattedValueValueQuery extends Query { - - private IFormattedDataDMContext fDmc; + public class GetFormattedValueValueQuery extends RegistersServiceQuery { private String fFormatId; public GetFormattedValueValueQuery(IFormattedDataDMContext dmc, String formatId) { - super(); - fDmc = dmc; + super(dmc); fFormatId = formatId; } @Override - protected void execute(final DataRequestMonitor rm) { - /* - * We're in another dispatch, so we must guard against executor - * shutdown again. - */ - final DsfSession session = DsfSession.getSession(fDmc.getSessionId()); - if (session == null) { - cancel(false); - rm.done(); - return; - } - - /* - * Guard against a disposed service - */ - IRegisters service = getService(); - if (service == null) { - rm.setStatus(new Status(IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, - "Service unavailable", null)); //$NON-NLS-1$ - rm.done(); - return; - } - + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { /* * Convert to the proper formatting DMC then go get the formatted * value. @@ -782,17 +610,18 @@ public class SyncRegisterDataAccess { FormattedValueDMContext formDmc = service.getFormattedValueContext(fDmc, fFormatId); - service.getFormattedExpressionValue(formDmc, new DataRequestMonitor(session - .getExecutor(), rm) { - @Override - protected void handleSuccess() { - /* - * All good set return value. - */ - rm.setData(getData().getFormattedValue()); - rm.done(); - } - }); + service.getFormattedExpressionValue( + formDmc, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + /* + * All good set return value. + */ + rm.setData(getData().getFormattedValue()); + rm.done(); + } + }); } } @@ -829,7 +658,7 @@ public class SyncRegisterDataAccess { * data. */ try { - return (String) query.get(); + return query.get(); } catch (InterruptedException e) { assert false; return null; @@ -871,7 +700,7 @@ public class SyncRegisterDataAccess { * data. */ try { - return (String) query.get(); + return query.get(); } catch (InterruptedException e) { assert false; return null; @@ -879,4 +708,106 @@ public class SyncRegisterDataAccess { return null; } } + + public class GetRegisterGroupDataQuery extends RegistersServiceQuery { + + public GetRegisterGroupDataQuery(IRegisterGroupDMContext dmc) { + super(dmc); + } + + @Override + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { + service.getRegisterGroupData(fDmc, rm); + } + } + + public IRegisterGroupDMData getRegisterGroupDMData(Object element) { + IRegisterGroupDMContext dmc = null; + if (element instanceof IDMVMContext) { + dmc = DMContexts.getAncestorOfType( + ((IDMVMContext) element).getDMContext(), + IRegisterGroupDMContext.class); + } + + DsfSession session = DsfSession.getSession(dmc.getSessionId()); + + if (dmc != null && session != null) { + GetRegisterGroupDataQuery query = new GetRegisterGroupDataQuery(dmc); + session.getExecutor().execute(query); + + try { + return query.get(); + } catch (InterruptedException e) { + } catch (ExecutionException e) { + } + } + return null; + } + + + public class GetRegisterDataQuery extends RegistersServiceQuery { + + public GetRegisterDataQuery(IRegisterDMContext dmc) { + super(dmc); + } + + @Override + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { + service.getRegisterData(fDmc, rm); + } + } + + public IRegisterDMData getRegisterDMData(Object element) { + IRegisterDMContext dmc = null; + if (element instanceof IDMVMContext) { + dmc = DMContexts.getAncestorOfType( ((IDMVMContext) element).getDMContext(), IRegisterDMContext.class ); + } + DsfSession session = DsfSession.getSession(dmc.getSessionId()); + + if (dmc != null && session != null) { + GetRegisterDataQuery query = new GetRegisterDataQuery(dmc); + session.getExecutor().execute(query); + + try { + return query.get(); + } catch (InterruptedException e) { + } catch (ExecutionException e) { + } + } + return null; + } + + public class GetBitFieldQuery extends RegistersServiceQuery { + + public GetBitFieldQuery(IBitFieldDMContext dmc) { + super(dmc); + } + + @Override + protected void doExecute(IRegisters service, final DataRequestMonitor rm) { + service.getBitFieldData(fDmc, rm); + } + } + + public IBitFieldDMData getBitFieldDMData(Object element) { + IBitFieldDMContext dmc = null; + if (element instanceof IDMVMContext) { + dmc = DMContexts.getAncestorOfType( ((IDMVMContext) element).getDMContext(), IBitFieldDMContext.class ); + } + DsfSession session = DsfSession.getSession(dmc.getSessionId()); + + if (dmc != null && session != null) { + GetBitFieldQuery query = new GetBitFieldQuery(dmc); + session.getExecutor().execute(query); + + try { + return query.get(); + } catch (InterruptedException e) { + } catch (ExecutionException e) { + } + } + return null; + } + + } diff --git a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRegisters.java b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRegisters.java index afd2193a50f..f96f134c295 100644 --- a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRegisters.java +++ b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRegisters.java @@ -32,7 +32,6 @@ public interface IRegisters extends IFormattedValues { /** Register group context */ public interface IRegisterGroupDMContext extends IFormattedDataDMContext { - public String getName(); } /** Event indicating values for the group have changed. */ @@ -52,7 +51,6 @@ public interface IRegisters extends IFormattedValues { /** Register context */ public interface IRegisterDMContext extends IFormattedDataDMContext { - public String getName(); } /** Event indicating register value changed. */ @@ -73,7 +71,6 @@ public interface IRegisters extends IFormattedValues { /** Bit field context */ public interface IBitFieldDMContext extends IFormattedDataDMContext { - public String getName(); } /** Event indicating register value changed. */ diff --git a/plugins/org.eclipse.dd.tests.gdb/src/org/eclipse/dd/tests/gdb/MIRegistersTest.java b/plugins/org.eclipse.dd.tests.gdb/src/org/eclipse/dd/tests/gdb/MIRegistersTest.java index 4dc7c5c6e6a..c3c109ccfec 100644 --- a/plugins/org.eclipse.dd.tests.gdb/src/org/eclipse/dd/tests/gdb/MIRegistersTest.java +++ b/plugins/org.eclipse.dd.tests.gdb/src/org/eclipse/dd/tests/gdb/MIRegistersTest.java @@ -9,14 +9,19 @@ import java.util.List; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor; import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; +import org.eclipse.dd.dsf.concurrent.ImmediateExecutor; +import org.eclipse.dd.dsf.concurrent.Query; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.debug.service.IFormattedValues; import org.eclipse.dd.dsf.debug.service.IRegisters; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext; +import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMData; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMContext; +import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterGroupDMData; import org.eclipse.dd.dsf.debug.service.IStack.IFrameDMContext; import org.eclipse.dd.dsf.service.DsfServicesTracker; import org.eclipse.dd.dsf.service.DsfSession; @@ -189,9 +194,19 @@ public class MIRegistersTest extends BaseTestCase { public void getRegisterGroups() throws Throwable { final IRegisterGroupDMContext regGroupsDMC = getRegisterGroup(); + Query query = new Query() { + @Override + protected void execute(DataRequestMonitor rm) { + fRegService.getRegisterGroupData(regGroupsDMC, rm); + } + }; + fSession.getExecutor().execute(query); + + IRegisterGroupDMData data = query.get(); + assertTrue("The name of the main group should be: General Registers instead of: " + - regGroupsDMC.getName(), - regGroupsDMC.getName().equals("General Registers")); + data.getName(), + data.getName().equals("General Registers")); } @Test @@ -211,8 +226,36 @@ public class MIRegistersTest extends BaseTestCase { IFrameDMContext frameDmc = SyncUtil.SyncGetStackFrame(execDmc, 0); final IRegisterDMContext[] regDMCs = getRegisters(frameDmc); List regNames = Arrays.asList("eax","ecx","edx","ebx","esp","ebp","esi","edi","eip","eflags","cs","ss","ds","es","fs","gs","st0","st1","st2","st3","st4","st5","st6","st7","fctrl","fstat","ftag","fiseg","fioff","foseg","fooff","fop","xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7","mxcsr","orig_eax","mm0","mm1","mm2","mm3","mm4","mm5","mm6","mm7"); - for(IRegisterDMContext reg: regDMCs){ - String regName = reg.getName(); + + Query query = new Query() { + @Override + protected void execute(DataRequestMonitor rm) { + final IRegisterDMData[] datas = new IRegisterDMData[regDMCs.length]; + rm.setData(datas); + final CountingRequestMonitor countingRm = new CountingRequestMonitor(ImmediateExecutor.getInstance(), rm); + countingRm.setDoneCount(regDMCs.length); + for (int i = 0; i < regDMCs.length; i++) { + final int index = i; + fRegService.getRegisterData( + regDMCs[index], + new DataRequestMonitor(ImmediateExecutor.getInstance(), countingRm) { + @Override + protected void handleSuccess() { + datas[index] = getData(); + countingRm.done(); + } + }); + } + + } + }; + + fSession.getExecutor().execute(query); + + IRegisterDMData[] datas = query.get(); + + for(IRegisterDMData data: datas){ + String regName = data.getName(); Assert.assertFalse("GDB does not support register name: " + regName, !regNames.contains(regName)); } }