提交 5b6b26cd 编写于 作者: C chegar

8044187: Enhancements to InnocuousThread

Reviewed-by: alanb
上级 1dc4e5fd
...@@ -26,7 +26,10 @@ ...@@ -26,7 +26,10 @@
package sun.misc; package sun.misc;
import java.security.AccessControlContext; import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.ProtectionDomain; import java.security.ProtectionDomain;
import java.security.PrivilegedAction;
import java.util.concurrent.atomic.AtomicInteger;
/** /**
* A thread that has no permissions, is not a member of any user-defined * A thread that has no permissions, is not a member of any user-defined
...@@ -36,22 +39,35 @@ import java.security.ProtectionDomain; ...@@ -36,22 +39,35 @@ import java.security.ProtectionDomain;
*/ */
public final class InnocuousThread extends Thread { public final class InnocuousThread extends Thread {
private static final Unsafe UNSAFE; private static final Unsafe UNSAFE;
private static final ThreadGroup THREADGROUP; private static final ThreadGroup INNOCUOUSTHREADGROUP;
private static final AccessControlContext ACC; private static final AccessControlContext ACC;
private static final long THREADLOCALS; private static final long THREADLOCALS;
private static final long INHERITABLETHREADLOCALS; private static final long INHERITABLETHREADLOCALS;
private static final long INHERITEDACCESSCONTROLCONTEXT; private static final long INHERITEDACCESSCONTROLCONTEXT;
private static final AtomicInteger threadNumber = new AtomicInteger(1);
public InnocuousThread(Runnable target) { public InnocuousThread(Runnable target) {
super(THREADGROUP, target, "anInnocuousThread"); this(INNOCUOUSTHREADGROUP, target,
"InnocuousThread-" + threadNumber.getAndIncrement());
}
public InnocuousThread(Runnable target, String name) {
this(INNOCUOUSTHREADGROUP, target, name);
}
private InnocuousThread(ThreadGroup group, Runnable target, String name) {
super(group, target, name);
UNSAFE.putOrderedObject(this, INHERITEDACCESSCONTROLCONTEXT, ACC); UNSAFE.putOrderedObject(this, INHERITEDACCESSCONTROLCONTEXT, ACC);
eraseThreadLocals(); eraseThreadLocals();
} }
// always report system class loader, or null
private ClassLoader contextClassLoader = ClassLoader.getSystemClassLoader();
@Override @Override
public ClassLoader getContextClassLoader() { public ClassLoader getContextClassLoader() {
// always report system class loader return contextClassLoader;
return ClassLoader.getSystemClassLoader();
} }
@Override @Override
...@@ -61,7 +77,10 @@ public final class InnocuousThread extends Thread { ...@@ -61,7 +77,10 @@ public final class InnocuousThread extends Thread {
@Override @Override
public void setContextClassLoader(ClassLoader cl) { public void setContextClassLoader(ClassLoader cl) {
throw new SecurityException("setContextClassLoader"); if (cl == null)
contextClassLoader = null;
else
throw new SecurityException("setContextClassLoader");
} }
// ensure run method is run only once // ensure run method is run only once
...@@ -113,7 +132,10 @@ public final class InnocuousThread extends Thread { ...@@ -113,7 +132,10 @@ public final class InnocuousThread extends Thread {
break; break;
group = parent; group = parent;
} }
THREADGROUP = new ThreadGroup(group, "InnocuousThreadGroup"); final ThreadGroup root = group;
INNOCUOUSTHREADGROUP = AccessController.doPrivileged(
(PrivilegedAction<ThreadGroup>) () ->
{ return new ThreadGroup(root, "InnocuousThreadGroup"); });
} catch (Exception e) { } catch (Exception e) {
throw new Error(e); throw new Error(e);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册