You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2006/11/07 08:31:57 UTC
svn commit: r472013 - in
/incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework:
PackageAdminActivator.java PackageAdminImpl.java StartLevelActivator.java
StartLevelImpl.java
Author: rickhall
Date: Mon Nov 6 23:31:57 2006
New Revision: 472013
URL: http://svn.apache.org/viewvc?view=rev&rev=472013
Log:
Applied patch (FELIX-170) to stop the start level and package admin threads
when the framework shuts down.
Modified:
incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminActivator.java
incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelActivator.java
incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelImpl.java
Modified: incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminActivator.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminActivator.java?view=diff&rev=472013&r1=472012&r2=472013
==============================================================================
--- incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminActivator.java (original)
+++ incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminActivator.java Mon Nov 6 23:31:57 2006
@@ -24,6 +24,7 @@
{
private Felix m_felix = null;
private ServiceRegistration m_reg = null;
+ private PackageAdminImpl m_packageAdmin = null;
public PackageAdminActivator(Felix felix)
{
@@ -32,13 +33,15 @@
public void start(BundleContext context) throws Exception
{
+ m_packageAdmin = new PackageAdminImpl(m_felix);
m_reg = context.registerService(
org.osgi.service.packageadmin.PackageAdmin.class.getName(),
- new PackageAdminImpl(m_felix), null);
+ m_packageAdmin, null);
}
public void stop(BundleContext context) throws Exception
{
m_reg.unregister();
+ m_packageAdmin.stop();
}
}
Modified: incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java?view=diff&rev=472013&r1=472012&r2=472013
==============================================================================
--- incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java (original)
+++ incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java Mon Nov 6 23:31:57 2006
@@ -29,6 +29,7 @@
private Felix m_felix = null;
private Bundle[][] m_reqBundles = null;
private Bundle m_systemBundle = null;
+ private Thread m_thread = null;
public PackageAdminImpl(Felix felix)
{
@@ -36,12 +37,35 @@
m_systemBundle = m_felix.getBundle(0);
// Start a thread to perform asynchronous package refreshes.
- Thread t = new Thread(this, "FelixPackageAdmin");
- t.setDaemon(true);
- t.start();
+ m_thread = new Thread(this, "FelixPackageAdmin");
+ m_thread.setDaemon(true);
+ m_thread.start();
}
/**
+ * Stops the FelixPackageAdmin thread on system shutdown. Shutting down the
+ * thread explicitly is required in the embedded case, where Felix may be
+ * stopped without the Java VM being stopped. In this case the
+ * FelixPackageAdmin thread must be stopped explicitly.
+ * <p>
+ * This method is called by the
+ * {@link PackageAdminActivator#stop(BundleContext)} method.
+ */
+ synchronized void stop()
+ {
+ if (m_thread != null)
+ {
+ // Null thread variable to signal to the thread that
+ // we want it to exit.
+ m_thread = null;
+
+ // Wake up the thread, if it is currently in the wait() state
+ // for more work.
+ notifyAll();
+ }
+ }
+
+ /**
* Returns the bundle associated with this class if the class was
* loaded from a bundle, otherwise returns null.
*
@@ -210,6 +234,12 @@
// Wait for a refresh request.
while (m_reqBundles == null)
{
+ // Terminate the thread if requested to do so (see stop()).
+ if (m_thread == null)
+ {
+ return;
+ }
+
try
{
wait();
Modified: incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelActivator.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelActivator.java?view=diff&rev=472013&r1=472012&r2=472013
==============================================================================
--- incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelActivator.java (original)
+++ incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelActivator.java Mon Nov 6 23:31:57 2006
@@ -23,6 +23,7 @@
class StartLevelActivator implements BundleActivator
{
private Felix m_felix = null;
+ private StartLevelImpl m_startLevel = null;
private ServiceRegistration m_reg = null;
public StartLevelActivator(Felix felix)
@@ -32,13 +33,15 @@
public void start(BundleContext context) throws Exception
{
+ m_startLevel = new StartLevelImpl(m_felix);
m_reg = context.registerService(
org.osgi.service.startlevel.StartLevel.class.getName(),
- new StartLevelImpl(m_felix), null);
+ m_startLevel, null);
}
public void stop(BundleContext context) throws Exception
{
m_reg.unregister();
+ m_startLevel.stop();
}
}
Modified: incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelImpl.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelImpl.java?view=diff&rev=472013&r1=472012&r2=472013
==============================================================================
--- incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelImpl.java (original)
+++ incubator/felix/trunk/framework/src/main/java/org/apache/felix/framework/StartLevelImpl.java Mon Nov 6 23:31:57 2006
@@ -39,16 +39,43 @@
private Felix m_felix = null;
private List m_requestList = null;
private Bundle m_systemBundle = null;
-
+ private Thread m_thread = null;
+
public StartLevelImpl(Felix felix)
{
m_felix = felix;
m_requestList = new ArrayList();
m_systemBundle = m_felix.getBundle(0);
// Start a thread to perform asynchronous package refreshes.
- Thread t = new Thread(this, "FelixStartLevel");
- t.setDaemon(true);
- t.start();
+ m_thread = new Thread(this, "FelixStartLevel");
+ m_thread.setDaemon(true);
+ m_thread.start();
+ }
+
+ /**
+ * Stops the FelixStartLevel thread on system shutdown. Shutting down the
+ * thread explicitly is required in the embedded case, where Felix may be
+ * stopped without the Java VM being stopped. In this case the
+ * FelixStartLevel thread must be stopped explicitly.
+ * <p>
+ * This method is called by the
+ * {@link StartLevelActivator#stop(BundleContext)} method.
+ */
+ void stop()
+ {
+ synchronized (m_requestList)
+ {
+ if (m_thread != null)
+ {
+ // Null thread variable to signal to the thread that
+ // we want it to exit.
+ m_thread = null;
+
+ // Wake up the thread, if it is currently in the wait() state
+ // for more work.
+ m_requestList.notifyAll();
+ }
+ }
}
/* (non-Javadoc)
@@ -199,6 +226,12 @@
// Wait for a request.
while (m_requestList.size() == 0)
{
+ // Terminate the thread if requested to do so (see stop()).
+ if (m_thread == null)
+ {
+ return;
+ }
+
try
{
m_requestList.wait();