You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by gn...@apache.org on 2012/07/25 09:16:10 UTC

svn commit: r1365477 - /aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java

Author: gnodet
Date: Wed Jul 25 07:16:09 2012
New Revision: 1365477

URL: http://svn.apache.org/viewvc?rev=1365477&view=rev
Log:
[ARIES-867] Deadlock if stopping a blueprint bundle while the blueprint container is in the create state.

Modified:
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java

Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java?rev=1365477&r1=1365476&r2=1365477&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java Wed Jul 25 07:16:09 2012
@@ -146,6 +146,7 @@ public class BlueprintContainerImpl 
     private ScheduledFuture timeoutFuture;
     private final AtomicBoolean scheduled = new AtomicBoolean();
     private final AtomicBoolean running = new AtomicBoolean();
+    private Thread runningThread;
     private List<ServiceRecipe> services;
     private AccessControlContext accessControlContext;
     private final IdSpace tempRecipeIdSpace = new IdSpace();
@@ -237,11 +238,15 @@ public class BlueprintContainerImpl 
         scheduled.set(false);
         synchronized (scheduled) {
             synchronized (running) {
+                runningThread = Thread.currentThread();
                 running.set(true);
-                try {
-                    doRun();
-                } finally {
+            }
+            try {
+                doRun();
+            } finally {
+                synchronized (running) {
                     running.set(false);
+                    runningThread = null;
                     running.notifyAll();
                 }
             }
@@ -823,12 +828,10 @@ public class BlueprintContainerImpl 
         unregisterServices();
 
         synchronized (running) {
-            if (handlerSet != null) {
-                handlerSet.removeListener(this);
-                handlerSet.destroy();
-            }
-            
             while (running.get()) {
+                if (runningThread != null) {
+                    runningThread.interrupt();
+                }
                 try {
                     running.wait();
                 } catch (InterruptedException e) {
@@ -836,6 +839,10 @@ public class BlueprintContainerImpl 
                 }
             }
         }
+        if (handlerSet != null) {
+            handlerSet.removeListener(this);
+            handlerSet.destroy();
+        }
 
         destroyComponents();