From c5b151520f0ebcacf59b9c72afdac0e013208030 Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Tue, 12 Dec 2006 01:15:26 +0000 Subject: [PATCH] Exceptions during shutdown cleanup. --- .../src/org/eclipse/dd/dsf/DsfPlugin.java | 1 - .../dd/dsf/concurrent/DefaultDsfExecutor.java | 40 ++++++------------- .../dd/dsf/service/AbstractDsfService.java | 1 - .../dd/dsf/service/DsfServicesTracker.java | 2 + .../eclipse/dd/dsf/service/DsfSession.java | 2 + 5 files changed, 17 insertions(+), 29 deletions(-) diff --git a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/DsfPlugin.java b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/DsfPlugin.java index 1e3f7290dec..6a1fb6e93ab 100644 --- a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/DsfPlugin.java +++ b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/DsfPlugin.java @@ -53,7 +53,6 @@ public class DsfPlugin extends Plugin { * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { - fgPlugin = null; fgBundleContext = null; super.stop(context); } diff --git a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/DefaultDsfExecutor.java b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/DefaultDsfExecutor.java index 7c212d3734b..0306ca368a3 100644 --- a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/DefaultDsfExecutor.java +++ b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/concurrent/DefaultDsfExecutor.java @@ -16,8 +16,6 @@ import java.io.PrintStream; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; -import java.util.concurrent.CancellationException; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -61,30 +59,6 @@ public class DefaultDsfExecutor extends ScheduledThreadPoolExecutor return Thread.currentThread().equals( ((DsfThreadFactory)getThreadFactory()).fThread ); } - @Override - protected void afterExecute(Runnable r, Throwable t) { - if (r instanceof Future) { - Future future = (Future)r; - try { - /* - * Try to retrieve the value, which should throw exception in - * case when exception was thrown within the Runnable/Callable. - * Must call isDone(), because scheduled futures would block - * on get. - */ - if (future.isDone()) { - future.get(); - } - } catch (InterruptedException e) { // Ignore - } catch (CancellationException e) { // Ignore also - } catch (ExecutionException e) { - if (e.getCause() != null) { - logException(e.getCause()); - } - } - } - } - static void logException(Throwable t) { DsfPlugin plugin = DsfPlugin.getDefault(); if (plugin == null) return; @@ -224,6 +198,7 @@ public class DefaultDsfExecutor extends ScheduledThreadPoolExecutor final Runnable fRunnable; public TracingWrapperRunnable(Runnable runnable, int offset) { super(offset); + if (runnable == null) throw new NullPointerException(); fRunnable = runnable; // Check if executable wasn't executed already. @@ -239,7 +214,15 @@ public class DefaultDsfExecutor extends ScheduledThreadPoolExecutor traceExecution(); // Finally invoke the runnable code. - fRunnable.run(); + try { + fRunnable.run(); + } catch (RuntimeException e) { + // If an exception was thrown in the Runnable, trace it. + // Because there is no one else to catch it, it is a + // programming error. + logException(e); + throw e; + } } } @@ -247,6 +230,7 @@ public class DefaultDsfExecutor extends ScheduledThreadPoolExecutor final Callable fCallable; public TracingWrapperCallable(Callable callable, int offset) { super(offset); + if (callable == null) throw new NullPointerException(); fCallable = callable; } @@ -256,6 +240,8 @@ public class DefaultDsfExecutor extends ScheduledThreadPoolExecutor traceExecution(); // Finally invoke the runnable code. + // Note that callables can throw exceptions that can be caught + // by clients that invoked them using ExecutionException. return fCallable.call(); } } diff --git a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/AbstractDsfService.java b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/AbstractDsfService.java index b70e857ef65..5cd80de03c2 100644 --- a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/AbstractDsfService.java +++ b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/AbstractDsfService.java @@ -48,7 +48,6 @@ abstract public class AbstractDsfService /** Properties that this service was registered with */ private String fFilter; - /** * Only constructor, requires a reference to the session that this * service belongs to. diff --git a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/DsfServicesTracker.java b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/DsfServicesTracker.java index 1253077b32a..91e204b86fa 100644 --- a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/DsfServicesTracker.java +++ b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/DsfServicesTracker.java @@ -112,6 +112,8 @@ public class DsfServicesTracker { } } catch(InvalidSyntaxException e) { assert false : "Invalid session ID syntax"; //$NON-NLS-1$ + } catch(IllegalStateException e) { + // Can occur when plugin is shutting down. } return null; } diff --git a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/DsfSession.java b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/DsfSession.java index b7eb38ad1d2..393f7246fe1 100644 --- a/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/DsfSession.java +++ b/plugins/org.eclipse.dd.dsf/src/org/eclipse/dd/dsf/service/DsfSession.java @@ -228,6 +228,8 @@ public class DsfSession /** Returns the owner ID of this session */ public String getOwnerId() { return fOwnerId; } + public boolean isActive() { return DsfSession.isSessionActive(fId); } + /** Returns the ID of this session */ public String getId() { return fId; }