From bb50284487a34946c09c313dbea3c3792f6b44ee Mon Sep 17 00:00:00 2001 From: Chris Hegarty Date: Thu, 28 Jul 2016 16:15:51 +0100 Subject: [PATCH] 8156824: com.sun.jndi.ldap.pool.PoolCleaner should clear its context class loader Reviewed-by: alanb, dfuchs --- .../classes/com/sun/jndi/ldap/LdapPoolManager.java | 13 ++++++++++++- .../classes/com/sun/jndi/ldap/pool/PoolCleaner.java | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapPoolManager.java b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapPoolManager.java index f89d07342e3..88c01ba43b4 100644 --- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapPoolManager.java +++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapPoolManager.java @@ -39,6 +39,7 @@ import java.security.PrivilegedAction; import com.sun.jndi.ldap.pool.PoolCleaner; import com.sun.jndi.ldap.pool.Pool; +import jdk.internal.misc.InnocuousThread; /** * Contains utilities for managing connection pools of LdapClient. @@ -163,7 +164,17 @@ public final class LdapPoolManager { if (idleTimeout > 0) { // Create cleaner to expire idle connections - new PoolCleaner(idleTimeout, pools).start(); + PrivilegedAction pa = new PrivilegedAction() { + public Void run() { + Thread t = InnocuousThread.newSystemThread( + "LDAP PoolCleaner", + new PoolCleaner(idleTimeout, pools)); + assert t.getContextClassLoader() == null; + t.setDaemon(true); + t.start(); + return null; + }}; + AccessController.doPrivileged(pa); } if (debug) { diff --git a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/pool/PoolCleaner.java b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/pool/PoolCleaner.java index 9c1c3bfd8b1..fcb3ae8e3d3 100644 --- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/pool/PoolCleaner.java +++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/pool/PoolCleaner.java @@ -30,7 +30,7 @@ package com.sun.jndi.ldap.pool; * * @author Rosanna Lee */ -final public class PoolCleaner extends Thread { +final public class PoolCleaner implements Runnable { final private Pool[] pools; final private long period; @@ -42,9 +42,9 @@ final public class PoolCleaner extends Thread { super(); this.period = period; this.pools = pools.clone(); - setDaemon(true); } + @Override public void run() { long threshold; while (true) {