Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Khodjaiants2012-09-20 18:33:47 +0000
committerMarc Khouzam2012-10-26 09:38:19 +0000
commit1ca3907ef303381073ed8b8c853d545e89e2502d (patch)
treeb1475bf16f0e2c12e54a050b2ffbef650660aad7 /dsf-gdb/org.eclipse.cdt.dsf.gdb.ui
parentfb6d56fd3ea4205c96a505cc2b30a8d1d26757d6 (diff)
downloadorg.eclipse.cdt-1ca3907ef303381073ed8b8c853d545e89e2502d.tar.gz
org.eclipse.cdt-1ca3907ef303381073ed8b8c853d545e89e2502d.tar.xz
org.eclipse.cdt-1ca3907ef303381073ed8b8c853d545e89e2502d.zip
Bug 360735: "Show Breakpoints Supported by Selected Target" should allow
to filter bp that don't apply to the active context Change-Id: I60d554359859cba64e4dd0d840c4a6ca63fd54d8 Reviewed-on: https://git.eclipse.org/r/7921 IP-Clean: Mikhail Khodjaiants <mikhailkhod@googlemail.com> Reviewed-by: Marc Khouzam <marc.khouzam@ericsson.com> IP-Clean: Marc Khouzam <marc.khouzam@ericsson.com> Tested-by: Marc Khouzam <marc.khouzam@ericsson.com>
Diffstat (limited to 'dsf-gdb/org.eclipse.cdt.dsf.gdb.ui')
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/breakpoints/GdbBreakpointVMProvider.java170
1 files changed, 153 insertions, 17 deletions
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/breakpoints/GdbBreakpointVMProvider.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/breakpoints/GdbBreakpointVMProvider.java
index b6b20dc5618..734a9b32c31 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/breakpoints/GdbBreakpointVMProvider.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/breakpoints/GdbBreakpointVMProvider.java
@@ -14,18 +14,22 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.RejectedExecutionException;
-import org.eclipse.cdt.debug.core.CDebugCorePlugin;
-import org.eclipse.cdt.debug.core.model.ICBreakpoint;
+import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
+import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
+import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointDMContext;
+import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext;
import org.eclipse.cdt.dsf.debug.service.IBreakpointsExtension;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.debug.ui.viewmodel.breakpoints.BreakpointVMProvider;
import org.eclipse.cdt.dsf.debug.ui.viewmodel.breakpoints.RawBreakpointVMNode;
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
+import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
+import org.eclipse.cdt.dsf.mi.service.MIBreakpointDMData;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
@@ -34,12 +38,15 @@ import org.eclipse.cdt.dsf.ui.viewmodel.IVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointUIConstants;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
/**
* @since 3.0
@@ -63,20 +70,35 @@ public class GdbBreakpointVMProvider extends BreakpointVMProvider {
}
@Override
- protected void calcFileteredBreakpoints(DataRequestMonitor<IBreakpoint[]> rm) {
- if (Boolean.TRUE.equals(getPresentationContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION))) {
- IBreakpoint[] allBreakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints();
- List<IBreakpoint> filteredBPs = new ArrayList<IBreakpoint>(allBreakpoints.length);
- for (IBreakpoint bp : allBreakpoints) {
- if (bp instanceof ICBreakpoint && bp.getModelIdentifier().equals(CDebugCorePlugin.PLUGIN_ID)) {
- filteredBPs.add(bp);
- }
- }
- rm.setData( filteredBPs.toArray(new IBreakpoint[filteredBPs.size()]) );
- rm.done();
- } else {
- super.calcFileteredBreakpoints(rm);
- }
+ protected void calcFileteredBreakpoints( final DataRequestMonitor<IBreakpoint[]> rm ) {
+ if ( Boolean.TRUE.equals( getPresentationContext().getProperty( IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION ) ) ) {
+ IBreakpointsTargetDMContext bpContext = null;
+ IMIExecutionDMContext threadContext = null;
+ ISelection debugContext = getDebugContext();
+ if ( debugContext instanceof IStructuredSelection ) {
+ Object element = ((IStructuredSelection)debugContext).getFirstElement();
+ if ( element instanceof IDMVMContext ) {
+ bpContext = DMContexts.getAncestorOfType( ((IDMVMContext)element).getDMContext(), IBreakpointsTargetDMContext.class );
+ threadContext = DMContexts.getAncestorOfType( ((IDMVMContext)element).getDMContext(), IMIExecutionDMContext.class );
+ }
+ }
+
+ if ( bpContext == null || !fSession.getId().equals( bpContext.getSessionId() ) ) {
+ rm.setStatus( new Status(
+ IStatus.ERROR,
+ GdbUIPlugin.PLUGIN_ID,
+ IDsfStatusConstants.INVALID_HANDLE,
+ "Debug context doesn't contain a thread", //$NON-NLS-1$
+ null ) );
+ rm.done();
+ return;
+ }
+
+ getInstalledBreakpoints( bpContext, threadContext, rm );
+ }
+ else {
+ super.calcFileteredBreakpoints( rm );
+ }
}
@Override
@@ -146,4 +168,118 @@ public class GdbBreakpointVMProvider extends BreakpointVMProvider {
rm.done();
}
}
+
+ private ISelection getDebugContext() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if ( window != null ) {
+ return DebugUITools.getDebugContextManager().getContextService( window ).getActiveContext();
+ }
+ return StructuredSelection.EMPTY;
+ }
+
+ void getInstalledBreakpoints( final IBreakpointsTargetDMContext targetContext, final IMIExecutionDMContext threadContext, final DataRequestMonitor<IBreakpoint[]> rm ) {
+
+ try {
+ fSession.getExecutor().execute( new DsfRunnable() {
+ public void run() {
+ final IBreakpointsExtension bpService = fServicesTracker.getService( IBreakpointsExtension.class );
+ if ( bpService == null ) {
+ rm.setStatus( new Status(
+ IStatus.ERROR,
+ GdbUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE,
+ "Breakpoints service not available", //$NON-NLS-1$
+ null ) );
+ rm.done();
+ return;
+ }
+ bpService.getBreakpoints( targetContext, new DataRequestMonitor<IBreakpoints.IBreakpointDMContext[]>( fSession.getExecutor(), rm ) {
+
+ @Override
+ protected void handleSuccess() {
+ final MIBreakpointsManager bpManager = fServicesTracker.getService( MIBreakpointsManager.class );
+ if ( bpManager == null ) {
+ rm.setStatus( new Status(
+ IStatus.ERROR,
+ GdbUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE,
+ "Breakpoints service not available", //$NON-NLS-1$
+ null ) );
+ rm.done();
+ return;
+ }
+
+ if ( getData().length > 0 ) {
+ final List<IBreakpoint> bps = new ArrayList<IBreakpoint>( getData().length );
+ final CountingRequestMonitor crm = new CountingRequestMonitor( ImmediateExecutor.getInstance(), rm ) {
+
+ @Override
+ protected void handleSuccess() {
+ rm.setData( bps.toArray( new IBreakpoint[bps.size()] ) );
+ rm.done();
+ }
+ };
+ crm.setDoneCount( getData().length );
+
+ for ( final IBreakpointDMContext bpCtx : getData() ) {
+ bpService.getBreakpointDMData(
+ bpCtx,
+ new DataRequestMonitor<IBreakpoints.IBreakpointDMData>( ImmediateExecutor.getInstance(), crm ) {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.concurrent.RequestMonitor#handleSuccess()
+ */
+ @Override
+ protected void handleSuccess() {
+ if ( getData() instanceof MIBreakpointDMData ) {
+ MIBreakpointDMData data = (MIBreakpointDMData)getData();
+ if ( !data.isPending() && isThreadBreakpoint( threadContext, data )) {
+ IBreakpoint bp = bpManager.findPlatformBreakpoint( bpCtx );
+ if ( bp != null )
+ bps.add( bp );
+ }
+ crm.done();
+ }
+ }
+ } );
+ }
+ }
+ else {
+ rm.setData( new IBreakpoint[0] );
+ rm.done();
+ }
+ }
+ } );
+ }
+ } );
+ }
+ catch( RejectedExecutionException e ) {
+ rm.setStatus( new Status(
+ IStatus.ERROR,
+ GdbUIPlugin.PLUGIN_ID,
+ IDsfStatusConstants.INVALID_STATE,
+ "Request for monitor: '" + toString() + "' resulted in a rejected execution exception.", e ) ); //$NON-NLS-1$ //$NON-NLS-2$);
+ rm.done();
+ }
+ }
+
+ private boolean isThreadBreakpoint( IMIExecutionDMContext threadContext, MIBreakpointDMData data ) {
+ if ( threadContext == null || data.getThreadId() == null || data.getThreadId().length() == 0 ) {
+ // Ignore threads
+ return true;
+ }
+
+ int threadId = threadContext.getThreadId();
+ try {
+ int bpThreadId = Integer.parseInt( data.getThreadId() );
+ if ( bpThreadId == 0 )
+ return true;
+ return ( threadId == bpThreadId );
+ }
+ catch( NumberFormatException e ) {
+ GdbUIPlugin.getDefault().getLog().log( new Status(
+ IStatus.ERROR,
+ GdbUIPlugin.getUniqueIdentifier(),
+ "Invalid breakpoint thread id" ) ); //$NON-NLS-1$
+ }
+ return true;
+ }
}

Back to the top