Author: gnodet
Date: Mon Jul 13 15:20:15 2015
New Revision: 1690737

URL: http://svn.apache.org/r1690737
Log:
[FELIX-4942] Make sure all exceptions are propagated back to the caller when 
using the executor

Modified:
    
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java

Modified: 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java?rev=1690737&r1=1690736&r2=1690737&view=diff
==============================================================================
--- 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java 
(original)
+++ 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java 
Mon Jul 13 15:20:15 2015
@@ -2355,6 +2355,7 @@ public class ResolverImpl implements Res
     {
         private final Executor executor;
         private final AtomicInteger count = new AtomicInteger();
+        private Throwable throwable;
 
         public EnhancedExecutor(Executor executor)
         {
@@ -2372,6 +2373,16 @@ public class ResolverImpl implements Res
                     {
                         runnable.run();
                     }
+                    catch (Throwable t)
+                    {
+                        synchronized (count)
+                        {
+                            if (throwable == null)
+                            {
+                                throwable = t;
+                            }
+                        }
+                    }
                     finally
                     {
                         if (count.decrementAndGet() == 0)
@@ -2400,6 +2411,21 @@ public class ResolverImpl implements Res
                     {
                         throw new IllegalStateException(e);
                     }
+                    if (throwable != null)
+                    {
+                        if (throwable instanceof RuntimeException)
+                        {
+                            throw (RuntimeException) throwable;
+                        }
+                        else if (throwable instanceof Error)
+                        {
+                            throw (Error) throwable;
+                        }
+                        else
+                        {
+                            throw new RuntimeException(throwable);
+                        }
+                    }
                 }
             }
         }


Reply via email to