Author: gnodet
Date: Thu Nov 21 13:52:27 2013
New Revision: 1544179

URL: http://svn.apache.org/r1544179
Log:
[FELIX-4326] Possible Invalid BundleContext exception when shutting down the 
extender

Modified:
    
felix/trunk/utils/src/main/java/org/apache/felix/utils/extender/AbstractExtender.java

Modified: 
felix/trunk/utils/src/main/java/org/apache/felix/utils/extender/AbstractExtender.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/utils/src/main/java/org/apache/felix/utils/extender/AbstractExtender.java?rev=1544179&r1=1544178&r2=1544179&view=diff
==============================================================================
--- 
felix/trunk/utils/src/main/java/org/apache/felix/utils/extender/AbstractExtender.java
 (original)
+++ 
felix/trunk/utils/src/main/java/org/apache/felix/utils/extender/AbstractExtender.java
 Thu Nov 21 13:52:27 2013
@@ -52,6 +52,7 @@ public abstract class AbstractExtender i
     private final ConcurrentMap<Bundle, Extension> extensions = new 
ConcurrentHashMap<Bundle, Extension>();
     private final ConcurrentMap<Bundle, FutureTask> destroying = new 
ConcurrentHashMap<Bundle, FutureTask>();
     private volatile boolean stopping;
+    private volatile boolean stopped;
 
     private boolean synchronous;
     private boolean preemptiveShutdown;
@@ -115,6 +116,7 @@ public abstract class AbstractExtender i
 
     public void stop(BundleContext context) throws Exception {
         stopping = true;
+        this.context.removeBundleListener(this);
         while (!extensions.isEmpty()) {
             Collection<Bundle> toDestroy = 
chooseBundlesToDestroy(extensions.keySet());
             if (toDestroy == null || toDestroy.isEmpty()) {
@@ -134,6 +136,7 @@ public abstract class AbstractExtender i
             }
             executors = null;
         }
+        stopped = true;
     }
 
     protected void doStart() throws Exception {
@@ -172,6 +175,9 @@ public abstract class AbstractExtender i
 
 
     public void bundleChanged(BundleEvent event) {
+        if (stopped) {
+            return;
+        }
         Bundle bundle = event.getBundle();
         if (bundle.getState() != Bundle.ACTIVE && bundle.getState() != 
Bundle.STARTING) {
             // The bundle is not in STARTING or ACTIVE state anymore


Reply via email to