diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/contexts/DsfSuspendTrigger.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/contexts/DsfSuspendTrigger.java index af47331e64b..116cbced995 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/contexts/DsfSuspendTrigger.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/contexts/DsfSuspendTrigger.java @@ -100,9 +100,18 @@ public class DsfSuspendTrigger implements ISuspendTrigger { @ThreadSafe public void dispose() { - if (fEventListenerRegisterd) { - fSession.removeServiceEventListener(this); + try { + fSession.getExecutor().execute(new DsfRunnable() { + public void run() { + if (fEventListenerRegisterd) { + fSession.removeServiceEventListener(this); + } + } + }); + } catch (RejectedExecutionException e) { + // Session already gone. } + fServicesTracker.dispose(); fDisposed = true; } diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/SteppingController.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/SteppingController.java index 6dcb37110c6..14ccb4df44e 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/SteppingController.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/viewmodel/SteppingController.java @@ -16,6 +16,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -164,9 +165,17 @@ public final class SteppingController } public void dispose() { - if (fRunControl != null) { - getSession().removeServiceEventListener(this); - } + try { + fSession.getExecutor().execute(new DsfRunnable() { + public void run() { + if (fRunControl != null) { + getSession().removeServiceEventListener(this); + } + } + }); + } catch (RejectedExecutionException e) { + // Session already gone. + } IPreferenceStore store= DsfUIPlugin.getDefault().getPreferenceStore(); store.removePropertyChangeListener(fPreferencesListener); diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/service/DsfSession.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/service/DsfSession.java index 78d25e7e310..563acb828f8 100644 --- a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/service/DsfSession.java +++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/service/DsfSession.java @@ -305,6 +305,8 @@ public class DsfSession * listener will receive events from */ public void addServiceEventListener(Object listener, Filter filter) { + assert getExecutor().isInExecutorThread(); + ListenerEntry entry = new ListenerEntry(listener, filter); assert !fListeners.containsKey(entry); if (DEBUG_SESSION_LISTENERS) { @@ -325,6 +327,8 @@ public class DsfSession * @param listener listener to remove */ public void removeServiceEventListener(Object listener) { + assert getExecutor().isInExecutorThread(); + ListenerEntry entry = new ListenerEntry(listener, null); assert fListeners.containsKey(entry); if (DEBUG_SESSION_LISTENERS) {