Bug 540850 - Permanent freeze relating to breakpoint update

Do not lock BreakpointManager in the call to enableTriggerPoints() - it
will try to acquire workspace lock while modifying markers, and this can
deadlock with other threads trying to access BreakpointManager while
holding the workspace lock.

Instead, lock on fTriggerPointDisabledList instance.

Change-Id: I03c9fba2d8ec84dad0f7f1a598cbe8a908c9d94a
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
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 c738aaa..6b3ed75 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
@@ -1421,22 +1421,24 @@
 	}
 
 	@Override
-	public synchronized void enableTriggerPoints(IBreakpoint[] triggerPoints, boolean enable) {
+	public void enableTriggerPoints(IBreakpoint[] triggerPoints, boolean enable) {
 		IBreakpoint[] triggerPointArray = triggerPoints;
 		if (triggerPoints == null) {
 			if (enable) {
-				triggerPointArray = fTriggerPointDisabledList.toArray(new IBreakpoint[0]);
+				synchronized (fTriggerPointDisabledList) {
+					triggerPointArray = fTriggerPointDisabledList.toArray(new IBreakpoint[0]);
+				}
 			} else {
 				triggerPointArray = getTriggerPoints();
-				fTriggerPointDisabledList.clear();
 			}
 		}
+		List<IBreakpoint> toDisable = new ArrayList<>();
 		for (IBreakpoint iBreakpoint : triggerPointArray) {
 			try {
 				IMarker m = iBreakpoint.getMarker();
 				if (m != null && m.exists()) {
 					if (!enable && iBreakpoint.isEnabled()) {
-						fTriggerPointDisabledList.add(iBreakpoint);
+						toDisable.add(iBreakpoint);
 					}
 					iBreakpoint.setEnabled(enable);
 				}
@@ -1444,8 +1446,11 @@
 				// ignore
 			}
 		}
-		if (enable) {
+		synchronized (fTriggerPointDisabledList) {
 			fTriggerPointDisabledList.clear();
+			if (!enable) {
+				fTriggerPointDisabledList.addAll(toDisable);
+			}
 		}
 	}