From b6eef64a9823ce8c590f8afcc3d249f000636282 Mon Sep 17 00:00:00 2001 From: Chris Hegarty Date: Thu, 2 Apr 2015 11:43:11 +0100 Subject: [PATCH] 8047149: Enhance thread contexts in core libraries Reviewed-by: alanb --- .../java.base/share/classes/java/lang/ref/Finalizer.java | 5 +++-- .../java.base/share/classes/java/lang/ref/Reference.java | 3 ++- jdk/src/java.base/share/classes/sun/misc/GC.java | 3 +-- .../share/classes/sun/misc/ManagedLocalsThread.java | 9 +++++++++ .../share/classes/sun/misc/RequestProcessor.java | 2 +- jdk/src/java.base/share/classes/sun/misc/Signal.java | 2 +- .../share/classes/java/util/logging/LogManager.java | 3 ++- .../classes/java/util/prefs/MacOSXPreferencesFile.java | 3 ++- .../classes/java/util/prefs/AbstractPreferences.java | 3 ++- .../classes/java/util/prefs/FileSystemPreferences.java | 4 ++-- 10 files changed, 25 insertions(+), 12 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/ref/Finalizer.java b/jdk/src/java.base/share/classes/java/lang/ref/Finalizer.java index 6ae2262c5aa..cd84e62619d 100644 --- a/jdk/src/java.base/share/classes/java/lang/ref/Finalizer.java +++ b/jdk/src/java.base/share/classes/java/lang/ref/Finalizer.java @@ -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 { /* 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 { /* 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"); diff --git a/jdk/src/java.base/share/classes/java/lang/ref/Reference.java b/jdk/src/java.base/share/classes/java/lang/ref/Reference.java index 5febcae0299..2bab588f1f4 100644 --- a/jdk/src/java.base/share/classes/java/lang/ref/Reference.java +++ b/jdk/src/java.base/share/classes/java/lang/ref/Reference.java @@ -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 { /* 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 { diff --git a/jdk/src/java.base/share/classes/sun/misc/GC.java b/jdk/src/java.base/share/classes/sun/misc/GC.java index c77bf1d055b..4cfd9781274 100644 --- a/jdk/src/java.base/share/classes/sun/misc/GC.java +++ b/jdk/src/java.base/share/classes/sun/misc/GC.java @@ -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 (;;) { diff --git a/jdk/src/java.base/share/classes/sun/misc/ManagedLocalsThread.java b/jdk/src/java.base/share/classes/sun/misc/ManagedLocalsThread.java index 49298dca610..f7044124180 100644 --- a/jdk/src/java.base/share/classes/sun/misc/ManagedLocalsThread.java +++ b/jdk/src/java.base/share/classes/sun/misc/ManagedLocalsThread.java @@ -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(); diff --git a/jdk/src/java.base/share/classes/sun/misc/RequestProcessor.java b/jdk/src/java.base/share/classes/sun/misc/RequestProcessor.java index 54a62724de0..30131f42b29 100644 --- a/jdk/src/java.base/share/classes/sun/misc/RequestProcessor.java +++ b/jdk/src/java.base/share/classes/sun/misc/RequestProcessor.java @@ -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(); } diff --git a/jdk/src/java.base/share/classes/sun/misc/Signal.java b/jdk/src/java.base/share/classes/sun/misc/Signal.java index 07557a8d78f..a00ee9f089d 100644 --- a/jdk/src/java.base/share/classes/sun/misc/Signal.java +++ b/jdk/src/java.base/share/classes/sun/misc/Signal.java @@ -213,7 +213,7 @@ public final class Signal { } }; if (handler != null) { - new Thread(runnable, sig + " handler").start(); + new ManagedLocalsThread(runnable, sig + " handler").start(); } } diff --git a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java index 0f536b202e9..972b74a7efb 100644 --- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java +++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java @@ -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 diff --git a/jdk/src/java.prefs/macosx/classes/java/util/prefs/MacOSXPreferencesFile.java b/jdk/src/java.prefs/macosx/classes/java/util/prefs/MacOSXPreferencesFile.java index 6553ff6ed78..dc54a0d539b 100644 --- a/jdk/src/java.prefs/macosx/classes/java/util/prefs/MacOSXPreferencesFile.java +++ b/jdk/src/java.prefs/macosx/classes/java/util/prefs/MacOSXPreferencesFile.java @@ -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(); diff --git a/jdk/src/java.prefs/share/classes/java/util/prefs/AbstractPreferences.java b/jdk/src/java.prefs/share/classes/java/util/prefs/AbstractPreferences.java index a840dffab95..fd3ba69902a 100644 --- a/jdk/src/java.prefs/share/classes/java/util/prefs/AbstractPreferences.java +++ b/jdk/src/java.prefs/share/classes/java/util/prefs/AbstractPreferences.java @@ -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 diff --git a/jdk/src/java.prefs/unix/classes/java/util/prefs/FileSystemPreferences.java b/jdk/src/java.prefs/unix/classes/java/util/prefs/FileSystemPreferences.java index 7bcd1d3ad24..9d412ed7f67 100644 --- a/jdk/src/java.prefs/unix/classes/java/util/prefs/FileSystemPreferences.java +++ b/jdk/src/java.prefs/unix/classes/java/util/prefs/FileSystemPreferences.java @@ -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() { public Void run() { - Runtime.getRuntime().addShutdownHook(new Thread() { + Runtime.getRuntime().addShutdownHook(new ManagedLocalsThread() { public void run() { syncTimer.cancel(); syncWorld();