1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 357515 - [breakpoints] Target filter is not working when unchecking

the entire target.
This commit is contained in:
Mikhail Khodjaiants 2011-09-15 17:17:37 -04:00
parent 88411c52f8
commit e3bb6338ba

View file

@ -17,6 +17,7 @@
package org.eclipse.cdt.dsf.mi.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
@ -845,9 +846,9 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
final Map<ICBreakpoint, Set<String>> threadsIDs = fBreakpointThreads.get(dmc);
assert threadsIDs != null;
// Minimal validation
if (!platformBPs.containsKey(breakpoint)) {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INTERNAL_ERROR, UNKNOWN_BREAKPOINT, null));
boolean filtered = isBreakpointEntirelyFiltered(dmc, breakpoint);
if (filtered && !platformBPs.containsKey(breakpoint)) {
rm.done();
return;
}
@ -860,7 +861,7 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
// Note that Tracepoints are not affected by "skip-all"
boolean bpEnabled = attributes.get(ICBreakpoint.ENABLED).equals(true) &&
(breakpoint instanceof ICTracepoint || fBreakpointManager.isEnabled());
if (bpEnabled) {
if (!filtered && bpEnabled) {
attributes.put(ATTR_DEBUGGER_PATH, NULL_STRING);
attributes.put(ATTR_THREAD_FILTER, extractThreads(dmc, breakpoint));
attributes.put(ATTR_THREAD_ID, NULL_STRING);
@ -876,6 +877,11 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
}
return;
}
if (filtered) {
uninstallBreakpoint(dmc, breakpoint, rm );
return;
}
// Get the original breakpoint attributes
final Map<String,Object> original_attributes = platformBPs.get(breakpoint);
@ -975,8 +981,11 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
protected void handleSuccess() {
// Get the list of new back-end breakpoints contexts
newTargetBPs.addAll(getData());
for (IBreakpointDMContext newRef : newTargetBPs)
targetBPs.put(newRef, breakpoint);
threadsIDs.put(breakpoint, newThreads);
for (final IBreakpointDMContext ref : oldTargetBPs) {
targetBPs.remove(ref);
decrementInstallCount(ref, breakpoint, // A tad early but it should work...
new RequestMonitor(getExecutor(), removeRM) {
@Override
@ -1883,4 +1892,18 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo
return !(breakpoint instanceof ICWatchpoint);
}
/**
* Returns whether the breakpoint is filtered for given target.
*/
private boolean isBreakpointEntirelyFiltered(IBreakpointsTargetDMContext dmc, ICBreakpoint breakpoint) {
IContainerDMContext currentDmc = DMContexts.getAncestorOfType(dmc, IContainerDMContext.class);
try {
IContainerDMContext[] targetDmcs = getFilterExtension(breakpoint).getTargetFilters();
if (Arrays.asList(targetDmcs).contains(currentDmc))
return false;
}
catch(CoreException e) {
}
return true;
}
}