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.