[r321] Bug 152472 debug platform should not hold locks while notifying context change listeners
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
index 96da835..5755ebe 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
@@ -67,6 +67,7 @@
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
@@ -174,14 +175,16 @@
return fContext;
}
- protected synchronized void activate(ISelection selection) {
- fContext = selection;
+ protected void activate(final ISelection selection) {
+ synchronized (this) {
+ fContext = selection;
+ }
Object[] listeners = fListeners.getListeners();
for (int i = 0; i < listeners.length; i++) {
final IDebugContextListener listener = (IDebugContextListener) listeners[i];
SafeRunner.run(new ISafeRunnable() {
public void run() throws Exception {
- listener.contextActivated(fContext, ContextProvider.this.getPart());
+ listener.contextActivated(selection, ContextProvider.this.getPart());
}
public void handleException(Throwable exception) {
DebugUIPlugin.log(exception);
@@ -191,25 +194,31 @@
}
}
- protected synchronized void possibleContextChange(Object element) {
- if (fContext instanceof IStructuredSelection) {
- IStructuredSelection ss = (IStructuredSelection) fContext;
- if (ss.size() == 1 && ss.getFirstElement().equals(element)) {
- Object[] listeners = fListeners.getListeners();
- for (int i = 0; i < listeners.length; i++) {
- final IDebugContextListener listener = (IDebugContextListener) listeners[i];
- SafeRunner.run(new ISafeRunnable() {
- public void run() throws Exception {
- listener.contextChanged(fContext, ContextProvider.this.getPart());
- }
- public void handleException(Throwable exception) {
- DebugUIPlugin.log(exception);
- }
- });
-
- }
+ protected void possibleContextChange(Object element) {
+ synchronized (this) {
+ if (fContext instanceof IStructuredSelection) {
+ IStructuredSelection ss = (IStructuredSelection) fContext;
+ if (!(ss.size() == 1 && ss.getFirstElement().equals(element))) {
+ return;
+ }
+ } else {
+ return;
}
}
+ Object[] listeners = fListeners.getListeners();
+ final IStructuredSelection context = new StructuredSelection(element);
+ for (int i = 0; i < listeners.length; i++) {
+ final IDebugContextListener listener = (IDebugContextListener) listeners[i];
+ SafeRunner.run(new ISafeRunnable() {
+ public void run() throws Exception {
+ listener.contextChanged(context, ContextProvider.this.getPart());
+ }
+ public void handleException(Throwable exception) {
+ DebugUIPlugin.log(exception);
+ }
+ });
+
+ }
}
}