From 13d458d0b5ffc7e7c35e85e56b911556e2ceeb3a Mon Sep 17 00:00:00 2001 From: Justin Edelson Date: Wed, 8 Jun 2016 14:26:08 -0400 Subject: [PATCH] remove memory leak in HttpClient OSGi support --- .../http/osgi/impl/HttpProxyConfigurationActivator.java | 11 ++++++++--- .../org/apache/http/osgi/impl/OSGiClientBuilderFactory.java | 6 +++--- .../java/org/apache/http/osgi/impl/OSGiHttpClientBuilder.java | 10 ++++++---- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/HttpProxyConfigurationActivator.java b/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/HttpProxyConfigurationActivator.java index 6586601..44f7e3b 100644 --- a/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/HttpProxyConfigurationActivator.java +++ b/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/HttpProxyConfigurationActivator.java @@ -28,12 +28,13 @@ package org.apache.http.osgi.impl; import java.io.Closeable; import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import java.util.Dictionary; import java.util.Hashtable; import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; import java.util.Map; +import java.util.WeakHashMap; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.osgi.services.HttpClientBuilderFactory; @@ -62,7 +63,11 @@ public final class HttpProxyConfigurationActivator implements BundleActivator, M private final Map registeredConfigurations = new LinkedHashMap(); - private final List trackedHttpClients = new LinkedList(); + private final Collection trackedHttpClients; + + public HttpProxyConfigurationActivator() { + trackedHttpClients = Collections.newSetFromMap(new WeakHashMap()); + } /** * {@inheritDoc} diff --git a/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/OSGiClientBuilderFactory.java b/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/OSGiClientBuilderFactory.java index a8d1ed5..5bb081d 100644 --- a/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/OSGiClientBuilderFactory.java +++ b/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/OSGiClientBuilderFactory.java @@ -26,7 +26,7 @@ */ package org.apache.http.osgi.impl; -import java.util.List; +import java.util.Collection; import java.util.Map; import org.apache.http.impl.client.CloseableHttpClient; @@ -44,12 +44,12 @@ public final class OSGiClientBuilderFactory implements HttpClientBuilderFactory private final Map registeredConfigurations; - private final List trackedHttpClients; + private final Collection trackedHttpClients; public OSGiClientBuilderFactory( final BundleContext bundleContext, final Map registeredConfigurations, - final List trackedHttpClients) { + final Collection trackedHttpClients) { this.bundleContext = bundleContext; this.registeredConfigurations = registeredConfigurations; this.trackedHttpClients = trackedHttpClients; diff --git a/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/OSGiHttpClientBuilder.java b/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/OSGiHttpClientBuilder.java index d8d89a5..963e853 100644 --- a/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/OSGiHttpClientBuilder.java +++ b/httpclient-osgi/src/main/java/org/apache/http/osgi/impl/OSGiHttpClientBuilder.java @@ -26,7 +26,7 @@ */ package org.apache.http.osgi.impl; -import java.util.List; +import java.util.Collection; import java.util.Map; import org.apache.http.impl.client.CloseableHttpClient; @@ -39,12 +39,12 @@ import org.osgi.framework.ServiceRegistration; */ final class OSGiHttpClientBuilder extends HttpClientBuilder { - private final List trackedHttpClients; + private final Collection trackedHttpClients; public OSGiHttpClientBuilder( final BundleContext bundleContext, final Map registeredConfigurations, - final List trackedHttpClients) { + final Collection trackedHttpClients) { this.trackedHttpClients = trackedHttpClients; setDefaultCredentialsProvider( new OSGiCredentialsProvider(bundleContext, registeredConfigurations)); @@ -55,7 +55,9 @@ final class OSGiHttpClientBuilder extends HttpClientBuilder { @Override public CloseableHttpClient build() { final CloseableHttpClient httpClient = super.build(); - trackedHttpClients.add(httpClient); + synchronized (trackedHttpClients) { + trackedHttpClients.add(httpClient); + } return httpClient; } -- 2.8.4