Bug 364418 - [breakpoints] BreakpointManager deadlocks trying to restore
breakpoints
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java
index 7b9d27b..e3f9f5f 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java
@@ -677,7 +677,9 @@
manager.registerAdapters(actionFactory, ITerminate.class);
manager.registerAdapters(actionFactory, ILaunch.class);
manager.registerAdapters(actionFactory, IProcess.class);
- manager.registerAdapters(actionFactory, IDebugElement.class);
+ manager.registerAdapters(actionFactory, IDebugElement.class);
+ getBreakpointManager();
+ fBreakpointManager.start();
}
/**
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java
index 3fd04ff..5483ba2 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation 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
@@ -32,7 +32,7 @@
/**
* Abstract implementation of a breakpoint. This class is
- * intended to be subclassed by implementations
+ * intended to be sub-classed by implementations
* of breakpoints.
*
* @see IBreakpoint
@@ -40,18 +40,12 @@
*/
public abstract class Breakpoint extends PlatformObject implements IBreakpoint {
-
- static {
- // making sure that the BreakpointManager is correctly initialized
- // before any breakpoint marker related operation (see bug 54993)
- DebugPlugin.getDefault().getBreakpointManager().getBreakpoints();
- }
-
+
/**
* Underlying marker.
*/
private IMarker fMarker= null;
-
+
/**
* @see IBreakpoint#setMarker(IMarker)
*/
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
index c7f12a8..15c9de1 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
@@ -331,14 +331,21 @@
public void shutdown() {
getWorkspace().removeResourceChangeListener(this);
getWorkspace().removeResourceChangeListener(fPostChangeListener);
- fBreakpointListeners = null;
- fBreakpointsListeners = null;
- fBreakpointManagerListeners = null;
+ fBreakpointListeners.clear();
+ fBreakpointsListeners.clear();
+ fBreakpointManagerListeners.clear();
if(fImportParticipants != null) {
fImportParticipants.clear();
fImportParticipants = null;
fDefaultParticipant = null;
}
+ if(fBreakpoints != null) {
+ fBreakpoints.clear();
+ fBreakpoints = null;
+ }
+ if(fMarkersToBreakpoints != null) {
+ fMarkersToBreakpoints.clear();
+ }
}
/**
@@ -391,6 +398,17 @@
}
/**
+ * Perform any initialization of the manager.
+ *
+ * Called when {@link DebugPlugin#start(org.osgi.framework.BundleContext)} is called.
+ *
+ * @since 3.8
+ */
+ public void start() {
+ getBreakpoints0();
+ }
+
+ /**
* The BreakpointManager waits to load the breakpoints
* of the workspace until a request is made to retrieve the
* breakpoints.