FELIX-4627 : Event Admin - Memory Leak in AsyncDeliverTasks. Apply modified patch from Bob Paulin
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1621959 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/eventadmin/impl/changelog.txt b/eventadmin/impl/changelog.txt
index 56c4673..a8bc781 100644
--- a/eventadmin/impl/changelog.txt
+++ b/eventadmin/impl/changelog.txt
@@ -3,6 +3,7 @@
** Improvement
* [FELIX-4623] - Make Async to Sync ThreadPool Ratio Configurable
** Bug
+ * [FELIX-4627] - Potential Memory Leak in AsyncDeliverTasks
* [FELIX-4617] - Empty configurations for ignore topic and ignore timeout lead to error messages in the log
* [FELIX-4618] - NPE if config value for ignore topic or timeout is empty
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 465b2fa..dccb1cb 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
@@ -89,7 +89,7 @@
TaskExecuter executer = m_running_threads.get(currentThreadId);
if ( executer == null )
{
- executer = new TaskExecuter();
+ executer = new TaskExecuter(m_running_threads);
m_running_threads.put(currentThreadId, executer);
}
synchronized ( executer )
@@ -97,8 +97,10 @@
executer.add(info);
if ( !executer.isActive() )
{
+ // reactivate thread
executer.setSyncDeliverTasks(m_deliver_task);
m_pool.executeTask(executer);
+ m_running_threads.put(currentThreadId, executer);
}
}
//}
@@ -123,6 +125,12 @@
private volatile SyncDeliverTasks m_deliver_task;
+ private final Map<Long, TaskExecuter> m_running_threads;
+
+ public TaskExecuter(Map<Long, TaskExecuter> runningThreads) {
+ m_running_threads = runningThreads;
+ }
+
public boolean isActive()
{
return this.m_deliver_task != null;
@@ -156,6 +164,7 @@
if ( !running )
{
this.m_deliver_task = null;
+ this.m_running_threads.remove(this);
}
}
} while ( running );