From 06b3823732a6a7f999687391e99f7bae678f8027 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Thu, 15 Oct 2009 20:17:34 +0000 Subject: [PATCH] [292271] Guard against RejectedExecutionExceptions. Also, DsfServicesTracker.dispose() is now ThreadSafe so does not need to be called in the executor, which is good because we should still make this call even in the case of a RejectedExecution exception. --- .../ui/disassembly/DisassemblyPart.java | 71 +++++++++++-------- .../sourcelookup/DsfSourceDisplayAdapter.java | 15 ++-- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java index 975f459f19e..3910fec6f90 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.concurrent.ExecutionException; +import java.util.concurrent.RejectedExecutionException; import org.eclipse.cdt.core.IAddress; import org.eclipse.cdt.debug.core.CDIDebugModel; @@ -2362,21 +2363,23 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem if (fTargetContext != null) { if (fDebugSessionId != null) { if (getSession() != null) { - // Store the values that we are going to change - final DsfSession session = getSession(); - final DsfServicesTracker trackerToDispose= fServicesTracker; - session.getExecutor().execute(new DsfRunnable() { - public void run() { - session.removeServiceEventListener(DisassemblyPart.this); - if (trackerToDispose != null) { - trackerToDispose.dispose(); - } - - } - }); + try { + // Store the values that we are going to change + final DsfSession session = getSession(); + session.getExecutor().execute(new DsfRunnable() { + public void run() { + session.removeServiceEventListener(DisassemblyPart.this); + } + }); + } catch (RejectedExecutionException e) { + // Session is shut down. + } } } fDebugSessionId= sessionId; + if (fServicesTracker != null) { + fServicesTracker.dispose(); + } fServicesTracker = new DsfServicesTracker(DsfUIPlugin.getBundleContext(), sessionId); if (fViewer != null) { debugContextChanged(); @@ -2397,22 +2400,24 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem } } else if (fDebugSessionId != null) { if (getSession() != null) { - // Store the values that we are going to change - final DsfSession session = getSession(); - final DsfServicesTracker trackerToDispose= fServicesTracker; - session.getExecutor().execute(new DsfRunnable() { - public void run() { - session.removeServiceEventListener(DisassemblyPart.this); - if (trackerToDispose != null) { - trackerToDispose.dispose(); - } - - } - }); + try { + // Store the values that we are going to change + final DsfSession session = getSession(); + session.getExecutor().execute(new DsfRunnable() { + public void run() { + session.removeServiceEventListener(DisassemblyPart.this); + } + }); + } catch (RejectedExecutionException e) { + // Session is shut down. + } } fDebugSessionId= null; fTargetContext= null; - fServicesTracker= null; + if (fServicesTracker != null) { + fServicesTracker.dispose(); + fServicesTracker= null; + } if (fViewer != null) { debugContextChanged(); } @@ -2425,12 +2430,16 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem fUpdatePending = false; resetViewer(); if (fDebugSessionId != null) { - final DsfSession session= getSession(); - session.getExecutor().execute(new DsfRunnable() { - public void run() { - session.addServiceEventListener(DisassemblyPart.this, null); - } - }); + try { + final DsfSession session= getSession(); + session.getExecutor().execute(new DsfRunnable() { + public void run() { + session.addServiceEventListener(DisassemblyPart.this, null); + } + }); + } catch (RejectedExecutionException e) { + // Session is shut down. + } updatePC(PC_UNKNOWN); diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/sourcelookup/DsfSourceDisplayAdapter.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/sourcelookup/DsfSourceDisplayAdapter.java index b0aec5fd100..847ff4c1bb9 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/sourcelookup/DsfSourceDisplayAdapter.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/ui/sourcelookup/DsfSourceDisplayAdapter.java @@ -618,11 +618,16 @@ public class DsfSourceDisplayAdapter implements ISourceDisplay, ISteppingControl fController.removeSteppingControlParticipant(this); fController = null; } - fExecutor.execute(new DsfRunnable() { public void run() { - fSession.removeServiceEventListener(DsfSourceDisplayAdapter.this); - fServicesTracker.dispose(); - }}); - + + try { + fExecutor.execute(new DsfRunnable() { public void run() { + fSession.removeServiceEventListener(DsfSourceDisplayAdapter.this); + }}); + } catch (RejectedExecutionException e) { + // Session is shut down. + } + + fServicesTracker.dispose(); fSourceLookup.removeParticipants(new ISourceLookupParticipant[] {fSourceLookupParticipant}); // fSourceLookupParticipant is disposed by the source lookup director