From aea95b819aeac1cce43e8ad78cef413e3cebaa08 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 20 Dec 2019 02:23:05 +0100 Subject: [PATCH] Add Git#shutdown for releasing resources held by JGit process The shutdown method releases - ThreadLocal held by NLS - GlobalBundleCache used by NLS - Executor held by WorkQueue Bug: 437855 Bug: 550529 Change-Id: Icfdccd63668ca90c730ee47a52a17dbd58695ada Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java | 11 +++++++++++ .../src/org/eclipse/jgit/nls/GlobalBundleCache.java | 4 ++++ org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java | 9 +++++++++ 3 files changed, 24 insertions(+) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java index 01306f412..64314772b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java @@ -18,6 +18,8 @@ import java.io.IOException; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryBuilder; import org.eclipse.jgit.lib.RepositoryCache; +import org.eclipse.jgit.lib.internal.WorkQueue; +import org.eclipse.jgit.nls.NLS; import org.eclipse.jgit.util.FS; /** @@ -170,6 +172,15 @@ public class Git implements AutoCloseable { return new InitCommand(); } + /** + * Shutdown JGit and release resources it holds like NLS and thread pools + * @since 5.8 + */ + public static void shutdown() { + WorkQueue.getExecutor().shutdownNow(); + NLS.clear(); + } + /** * Construct a new {@link org.eclipse.jgit.api.Git} object which can * interact with the specified git repository. diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/nls/GlobalBundleCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/nls/GlobalBundleCache.java index 6d4437f4c..9b556393e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/nls/GlobalBundleCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/nls/GlobalBundleCache.java @@ -70,4 +70,8 @@ class GlobalBundleCache { throw new Error(e); } } + + static void clear() { + cachedBundles.clear(); + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java b/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java index daa039d34..d7dd3bee5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java @@ -100,6 +100,15 @@ public class NLS { return b.get(type); } + /** + * Release resources held by NLS + * @since 5.8 + */ + public static void clear() { + local.remove(); + GlobalBundleCache.clear(); + } + private final Locale locale; private final ConcurrentHashMap map = new ConcurrentHashMap<>();