8047149: Enhance thread contexts in core libraries

Reviewed-by: alanb
This commit is contained in:
Chris Hegarty 2015-04-02 11:43:11 +01:00
parent d81fa0fe0a
commit b6eef64a98
10 changed files with 25 additions and 12 deletions

View File

@ -28,6 +28,7 @@ package java.lang.ref;
import java.security.PrivilegedAction;
import java.security.AccessController;
import sun.misc.JavaLangAccess;
import sun.misc.ManagedLocalsThread;
import sun.misc.SharedSecrets;
import sun.misc.VM;
@ -126,7 +127,7 @@ final class Finalizer extends FinalReference<Object> { /* Package-private; must
for (ThreadGroup tgn = tg;
tgn != null;
tg = tgn, tgn = tg.getParent());
Thread sft = new Thread(tg, proc, "Secondary finalizer");
Thread sft = new ManagedLocalsThread(tg, proc, "Secondary finalizer");
sft.start();
try {
sft.join();
@ -185,7 +186,7 @@ final class Finalizer extends FinalReference<Object> { /* Package-private; must
}}});
}
private static class FinalizerThread extends Thread {
private static class FinalizerThread extends ManagedLocalsThread {
private volatile boolean running;
FinalizerThread(ThreadGroup g) {
super(g, "Finalizer");

View File

@ -27,6 +27,7 @@ package java.lang.ref;
import sun.misc.Cleaner;
import sun.misc.JavaLangRefAccess;
import sun.misc.ManagedLocalsThread;
import sun.misc.SharedSecrets;
/**
@ -126,7 +127,7 @@ public abstract class Reference<T> {
/* High-priority thread to enqueue pending References
*/
private static class ReferenceHandler extends Thread {
private static class ReferenceHandler extends ManagedLocalsThread {
private static void ensureClassInitialized(Class<?> clazz) {
try {

View File

@ -82,8 +82,7 @@ public class GC {
*/
public static native long maxObjectInspectionAge();
private static class Daemon extends Thread {
private static class Daemon extends ManagedLocalsThread {
public void run() {
for (;;) {

View File

@ -34,6 +34,10 @@ public class ManagedLocalsThread extends Thread {
private static final long THREAD_LOCALS;
private static final long INHERITABLE_THREAD_LOCALS;
public ManagedLocalsThread() {
eraseThreadLocals();
}
public ManagedLocalsThread(Runnable target) {
super(target);
eraseThreadLocals();
@ -44,6 +48,11 @@ public class ManagedLocalsThread extends Thread {
eraseThreadLocals();
}
public ManagedLocalsThread(ThreadGroup group, String name) {
super(group, name);
eraseThreadLocals();
}
public ManagedLocalsThread(ThreadGroup group, Runnable target, String name) {
super(group, target, name);
eraseThreadLocals();

View File

@ -77,7 +77,7 @@ public class RequestProcessor implements Runnable {
*/
public static synchronized void startProcessing() {
if (dispatcher == null) {
dispatcher = new Thread(new RequestProcessor(), "Request Processor");
dispatcher = new ManagedLocalsThread(new RequestProcessor(), "Request Processor");
dispatcher.setPriority(Thread.NORM_PRIORITY + 2);
dispatcher.start();
}

View File

@ -213,7 +213,7 @@ public final class Signal {
}
};
if (handler != null) {
new Thread(runnable, sig + " handler").start();
new ManagedLocalsThread(runnable, sig + " handler").start();
}
}

View File

@ -34,6 +34,7 @@ import java.lang.ref.WeakReference;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import sun.misc.JavaAWTAccess;
import sun.misc.ManagedLocalsThread;
import sun.misc.SharedSecrets;
/**
@ -248,7 +249,7 @@ public class LogManager {
// This private class is used as a shutdown hook.
// It does a "reset" to close all open handlers.
private class Cleaner extends Thread {
private class Cleaner extends ManagedLocalsThread {
private Cleaner() {
/* Set context class loader to null in order to avoid

View File

@ -31,6 +31,7 @@ import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;
import java.lang.ref.WeakReference;
import sun.misc.ManagedLocalsThread;
/*
@ -343,7 +344,7 @@ class MacOSXPreferencesFile {
{
if (timer == null) {
timer = new Timer(true); // daemon
Thread flushThread = new Thread() {
Thread flushThread = new ManagedLocalsThread() {
@Override
public void run() {
flushWorld();

View File

@ -29,6 +29,7 @@ import java.util.*;
import java.io.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.misc.ManagedLocalsThread;
// These imports needed only as a workaround for a JavaDoc bug
import java.lang.Integer;
import java.lang.Long;
@ -1470,7 +1471,7 @@ public abstract class AbstractPreferences extends Preferences {
* A single background thread ("the event notification thread") monitors
* the event queue and delivers events that are placed on the queue.
*/
private static class EventDispatchThread extends Thread {
private static class EventDispatchThread extends ManagedLocalsThread {
public void run() {
while(true) {
// Wait on eventQueue till an event is present

View File

@ -30,7 +30,7 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction;
import java.security.PrivilegedActionException;
import sun.misc.ManagedLocalsThread;
import sun.util.logging.PlatformLogger;
/**
@ -450,7 +450,7 @@ class FileSystemPreferences extends AbstractPreferences {
// Add shutdown hook to flush cached prefs on normal termination
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
Runtime.getRuntime().addShutdownHook(new Thread() {
Runtime.getRuntime().addShutdownHook(new ManagedLocalsThread() {
public void run() {
syncTimer.cancel();
syncWorld();