From da5c3c790eaf732b73a88b5523612f315d2c294d Mon Sep 17 00:00:00 2001 From: Ken Ryall Date: Thu, 29 Mar 2007 19:05:20 +0000 Subject: [PATCH] Added an ExecutableReloadedEvent so if the debugger backend detects that code has moved then CBreakpointManager can reinstall the breakpoints. --- .../event/ICDIExecutableReloadedEvent.java | 20 +++++++++++++++++ .../internal/core/CBreakpointManager.java | 22 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/event/ICDIExecutableReloadedEvent.java diff --git a/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/event/ICDIExecutableReloadedEvent.java b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/event/ICDIExecutableReloadedEvent.java new file mode 100644 index 00000000000..75a8e1544d2 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.core/cdi/org/eclipse/cdt/debug/core/cdi/event/ICDIExecutableReloadedEvent.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2007 Nokia and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Nokia - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.debug.core.cdi.event; + +/** + * + * Notifies that an executable had been reloaded, perhaps after being rebuilt. + */ + +public interface ICDIExecutableReloadedEvent extends ICDIEvent { + +} diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CBreakpointManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CBreakpointManager.java index 87c5dad265c..d2424d650ca 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CBreakpointManager.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CBreakpointManager.java @@ -39,6 +39,7 @@ import org.eclipse.cdt.debug.core.cdi.event.ICDICreatedEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIDestroyedEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener; +import org.eclipse.cdt.debug.core.cdi.event.ICDIExecutableReloadedEvent; import org.eclipse.cdt.debug.core.cdi.model.ICDIAddressBreakpoint; import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint; import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpointManagement2; @@ -362,6 +363,10 @@ public class CBreakpointManager implements IBreakpointsListener, IBreakpointMana if ( source instanceof ICDIBreakpoint ) handleBreakpointMovedEvent( (ICDIBreakpointMovedEvent) event ); } + else if ( event instanceof ICDIExecutableReloadedEvent ) { + if ( source instanceof ICDITarget ) + handleExecutableReloadedEvent( (ICDIExecutableReloadedEvent) event ); + } else if ( event instanceof ICDIBreakpointProblemEvent ) { if ( source instanceof ICDIBreakpoint ) handleBreakpointProblemEvent( (ICDIBreakpointProblemEvent) event ); @@ -517,6 +522,23 @@ public class CBreakpointManager implements IBreakpointsListener, IBreakpointMana } + private void handleExecutableReloadedEvent( ICDIExecutableReloadedEvent reloadedEvent ) + { + ArrayList uninstalledCBplist = new ArrayList(); + + IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager(); + IBreakpoint[] breakpoints = manager.getBreakpoints( CDIDebugModel.getPluginIdentifier() ); + + for (int i = 0; i < breakpoints.length; i++) { + if (breakpoints[i] instanceof ICBreakpoint && (getBreakpointMap().getCDIBreakpoint((ICBreakpoint) breakpoints[i]) == null)) + { + uninstalledCBplist.add(breakpoints[i]); + } + } + + setBreakpointsOnTarget((IBreakpoint[]) uninstalledCBplist.toArray(new IBreakpoint[uninstalledCBplist.size()])); + } + private void handleBreakpointProblemEvent( ICDIBreakpointProblemEvent problemEvent ) { ICBreakpoint breakpoint = getBreakpointMap().getCBreakpoint( problemEvent.getBreakpoint() );