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();
-
+
}
}