FELIX-4663 : Potential memory leak in AsyncDeliveryTask

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1629402 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/eventadmin/impl/changelog.txt b/eventadmin/impl/changelog.txt
index b4eae29..062b08e 100644
--- a/eventadmin/impl/changelog.txt
+++ b/eventadmin/impl/changelog.txt
@@ -3,6 +3,7 @@
 ** Improvement
     * [FELIX-4623] - Add test for thread based ordering
     * [FELIX-4638] - Less locking on event handler timing
+    * [FELIX-4663] - Potential memory leak in AsyncDeliveryTask
 
 
 Changes from 1.4.0 to 1.4.2
diff --git a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/AsyncDeliverTasks.java b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/AsyncDeliverTasks.java
index de70aad..0e5a3c6 100644
--- a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/AsyncDeliverTasks.java
+++ b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/AsyncDeliverTasks.java
@@ -98,7 +98,11 @@
                 {
                     // reactivate thread
                     executer.setSyncDeliverTasks(m_deliver_task);
-                    m_pool.executeTask(executer);
+                    if ( !m_pool.executeTask(executer) )
+                    {
+                        // scheduling failed: last resort, call directly
+                        executer.run();
+                    }
                     m_running_threads.put(currentThreadId, executer);
                 }
             }
diff --git a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/DefaultThreadPool.java b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/DefaultThreadPool.java
index 0e4fd42..3051b81 100644
--- a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/DefaultThreadPool.java
+++ b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/DefaultThreadPool.java
@@ -94,7 +94,7 @@
             }
         }
     }
-    
+
     /**
      * Returns current pool size.
      */
@@ -115,19 +115,20 @@
     /**
      * Execute the task in a free thread or create a new one.
      * @param task The task to execute
+     * @return {@code true} if the task execution could be scheduled, {@code false} otherwise.
      */
-    public void executeTask(final Runnable task)
-    {
+    public boolean executeTask(final Runnable task) {
         try
         {
             this.executor.submit(task);
+            return true;
         }
         catch (final Throwable t)
         {
             LogWrapper.getLogger().log(
                     LogWrapper.LOG_WARNING,
                     "Exception: " + t, t);
-            // ignore this
+            return false;
         }
     }
 }
diff --git a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/SyncDeliverTasks.java b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/SyncDeliverTasks.java
index e0f54fd..120fc23 100644
--- a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/SyncDeliverTasks.java
+++ b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/tasks/SyncDeliverTasks.java
@@ -92,7 +92,7 @@
 
         final Iterator<EventHandlerProxy> i = tasks.iterator();
         final BlacklistLatch handlerLatch = new BlacklistLatch(tasks.size(), this.timeout/2);
-        
+
         while ( i.hasNext() )
         {
             final EventHandlerProxy task = i.next();
@@ -111,14 +111,18 @@
                 }
                 else
                 {
-                	
+
                 	handlerLatch.addToBlacklistCheck(handlerTask);
-                    this.pool.executeTask(handlerTask);
+                    if ( !this.pool.executeTask(handlerTask) )
+                    {
+                        // scheduling failed: last resort, call directly
+                        handlerTask.run();
+                    }
                 }
-               
+
 //            }
         }
         handlerLatch.awaitAndBlacklistCheck();
-        
+
     }
 }