Made sure thread run() methods are reasonably robust in the face of
exceptions; added some comments to explain the approach. (FELIX-681)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@740901 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index f24d4df..bb91c47 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -3699,7 +3699,7 @@
{
stopBundle(m_bundle, false);
}
- catch (BundleException ex)
+ catch (Throwable ex)
{
fireFrameworkEvent(FrameworkEvent.ERROR, m_bundle, ex);
}
@@ -3728,7 +3728,7 @@
refreshBundle(m_bundle);
}
}
- catch (Exception ex)
+ catch (Throwable ex)
{
fireFrameworkEvent(FrameworkEvent.ERROR, m_bundle, ex);
}
@@ -3742,7 +3742,7 @@
{
startBundle(m_bundle, false);
}
- catch (BundleException ex)
+ catch (Throwable ex)
{
fireFrameworkEvent(FrameworkEvent.ERROR, m_bundle, ex);
}
diff --git a/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java b/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
index 3ccd241..16cdcf4 100644
--- a/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
@@ -331,6 +331,9 @@
}
// Perform refresh.
+ // NOTE: We don't catch any exceptions here, because
+ // the invoked method shields us from exceptions by
+ // catching Throwables when its invokes callbacks.
m_felix.refreshPackages(bundles);
// Remove the first request since it is now completed.
diff --git a/framework/src/main/java/org/apache/felix/framework/StartLevelImpl.java b/framework/src/main/java/org/apache/felix/framework/StartLevelImpl.java
index 8dafb70..0a71168 100644
--- a/framework/src/main/java/org/apache/felix/framework/StartLevelImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/StartLevelImpl.java
@@ -36,14 +36,12 @@
private static final int BUNDLE_IDX = 0;
private static final int STARTLEVEL_IDX = 1;
- private Logger m_logger = null;
- private Felix m_felix = null;
+ private final Felix m_felix;
private final List m_requestList = new ArrayList();
private Thread m_thread = null;
- public StartLevelImpl(Logger logger, Felix felix)
+ public StartLevelImpl(Felix felix)
{
- m_logger = logger;
m_felix = felix;
// Start a thread to perform asynchronous package refreshes.
m_thread = new Thread(this, "FelixStartLevel");
@@ -135,7 +133,7 @@
catch (InterruptedException ex)
{
// Log it and ignore since it won't cause much of an issue.
- m_logger.log(
+ m_felix.getLogger().log(
Logger.LOG_WARNING,
"Wait for start level change during shutdown interrupted.",
ex);
@@ -256,6 +254,9 @@
// is to set the framework start level. If the request is
// an Object array, then the request is to set the start
// level for a bundle.
+ // NOTE: We don't catch any exceptions here, because
+ // the invoked methods shield us from exceptions by
+ // catching Throwables when they invoke callbacks.
if (request instanceof Integer)
{
// Set the new framework start level.
diff --git a/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java b/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java
index 8b3a565..5213202 100644
--- a/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java
+++ b/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java
@@ -868,6 +868,9 @@
// Deliver event outside of synchronized block
// so that we don't block other requests from being
// queued during event processing.
+ // NOTE: We don't catch any exceptions here, because
+ // the invoked method shields us from exceptions by
+ // catching Throwables when it invokes callbacks.
fireEventImmediately(req.m_logger, req.m_type, req.m_listeners, req.m_event);
// Put dispatch request in cache.
@@ -893,4 +896,4 @@
public Object[] m_listeners = null;
public EventObject m_event = null;
}
-}
+}
\ No newline at end of file