1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 02:06:01 +02:00

[298135]- Several calls to DsfSession add/removeServiceEventListener not on executor thread

This commit is contained in:
Pawel Piech 2010-01-06 00:38:05 +00:00
parent e31d06b003
commit c13753ddb3
3 changed files with 27 additions and 5 deletions

View file

@ -100,9 +100,18 @@ public class DsfSuspendTrigger implements ISuspendTrigger {
@ThreadSafe @ThreadSafe
public void dispose() { public void dispose() {
if (fEventListenerRegisterd) { try {
fSession.removeServiceEventListener(this); fSession.getExecutor().execute(new DsfRunnable() {
public void run() {
if (fEventListenerRegisterd) {
fSession.removeServiceEventListener(this);
}
}
});
} catch (RejectedExecutionException e) {
// Session already gone.
} }
fServicesTracker.dispose(); fServicesTracker.dispose();
fDisposed = true; fDisposed = true;
} }

View file

@ -16,6 +16,7 @@ import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -164,9 +165,17 @@ public final class SteppingController
} }
public void dispose() { public void dispose() {
if (fRunControl != null) { try {
getSession().removeServiceEventListener(this); 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(); IPreferenceStore store= DsfUIPlugin.getDefault().getPreferenceStore();
store.removePropertyChangeListener(fPreferencesListener); store.removePropertyChangeListener(fPreferencesListener);

View file

@ -305,6 +305,8 @@ public class DsfSession
* listener will receive events from * listener will receive events from
*/ */
public void addServiceEventListener(Object listener, Filter filter) { public void addServiceEventListener(Object listener, Filter filter) {
assert getExecutor().isInExecutorThread();
ListenerEntry entry = new ListenerEntry(listener, filter); ListenerEntry entry = new ListenerEntry(listener, filter);
assert !fListeners.containsKey(entry); assert !fListeners.containsKey(entry);
if (DEBUG_SESSION_LISTENERS) { if (DEBUG_SESSION_LISTENERS) {
@ -325,6 +327,8 @@ public class DsfSession
* @param listener listener to remove * @param listener listener to remove
*/ */
public void removeServiceEventListener(Object listener) { public void removeServiceEventListener(Object listener) {
assert getExecutor().isInExecutorThread();
ListenerEntry entry = new ListenerEntry(listener, null); ListenerEntry entry = new ListenerEntry(listener, null);
assert fListeners.containsKey(entry); assert fListeners.containsKey(entry);
if (DEBUG_SESSION_LISTENERS) { if (DEBUG_SESSION_LISTENERS) {