This is an automated email from the ASF dual-hosted git repository. twolf pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mina-sshd.git
commit 4037290a0849abc65dececd66ac1a6bdc5ba1cd9 Author: Thomas Wolf <tw...@apache.org> AuthorDate: Sun Oct 30 00:07:05 2022 +0200 Use ThreadLocal.remove() instead of ThreadLocal.set(null) ThreadLocal.set(null) keeps a reference to the ThreadLocal instance in the thread, which can lead to (small) memory leaks when threads are re-used, for instance via thread pools. --- .../sshd/common/util/threads/ThreadUtils.java | 26 +++++++++++++--------- .../apache/sshd/sftp/client/fs/SftpFileSystem.java | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java index d06da9f69..b93e81ed5 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java @@ -60,12 +60,15 @@ public final class ThreadUtils { * @see {@link #isInternal()} */ public static <V> V runAsInternal(Callable<V> code) throws Exception { - Boolean initial = IS_INTERNAL_THREAD.get(); - try { - IS_INTERNAL_THREAD.set(Boolean.TRUE); + if (isInternalThread()) { return code.call(); - } finally { - IS_INTERNAL_THREAD.set(initial); + } else { + try { + IS_INTERNAL_THREAD.set(Boolean.TRUE); + return code.call(); + } finally { + IS_INTERNAL_THREAD.remove(); + } } } @@ -82,12 +85,15 @@ public final class ThreadUtils { * @see {@link #isInternal()} */ public static <T, V> V runAsInternal(T param, IOFunction<? super T, V> code) throws IOException { - Boolean initial = IS_INTERNAL_THREAD.get(); - try { - IS_INTERNAL_THREAD.set(Boolean.TRUE); + if (isInternalThread()) { return code.apply(param); - } finally { - IS_INTERNAL_THREAD.set(initial); + } else { + try { + IS_INTERNAL_THREAD.set(Boolean.TRUE); + return code.apply(param); + } finally { + IS_INTERNAL_THREAD.remove(); + } } } diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpFileSystem.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpFileSystem.java index 47f999758..ae8049285 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpFileSystem.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpFileSystem.java @@ -298,7 +298,7 @@ public class SftpFileSystem if (!pool.offer(delegate)) { delegate.close(); } - wrappers.set(null); + wrappers.remove(); } }