< prev index next >

src/java.base/share/classes/jdk/internal/ref/CleanerFactory.java

Print this page

        

*** 24,33 **** --- 24,34 ---- */ package jdk.internal.ref; import jdk.internal.misc.InnocuousThread; + import jdk.internal.vm.annotation.ReservedStackAccess; import java.lang.ref.Cleaner; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.concurrent.ThreadFactory;
*** 36,47 **** * CleanerFactory provides a Cleaner for use within system modules. * The cleaner is created on the first reference to the CleanerFactory. */ public final class CleanerFactory { ! /* The common Cleaner. */ ! private final static Cleaner commonCleaner = Cleaner.create(new ThreadFactory() { @Override public Thread newThread(Runnable r) { return AccessController.doPrivileged(new PrivilegedAction<>() { @Override public Thread run() { --- 37,49 ---- * CleanerFactory provides a Cleaner for use within system modules. * The cleaner is created on the first reference to the CleanerFactory. */ public final class CleanerFactory { ! /* The common Cleaner. Lazily initialized */ ! private static class Common { ! static final Cleaner INSTANCE = Cleaner.create(new ThreadFactory() { @Override public Thread newThread(Runnable r) { return AccessController.doPrivileged(new PrivilegedAction<>() { @Override public Thread run() {
*** 50,68 **** return t; } }); } }); /** * Cleaner for use within system modules. ! * * This Cleaner will run on a thread whose context class loader * is {@code null}. The system cleaning action to perform in * this Cleaner should handle a {@code null} context class loader. * * @return a Cleaner for use within system modules */ public static Cleaner cleaner() { ! return commonCleaner; } } --- 52,105 ---- return t; } }); } }); + } + + /* The NIO DirectByteBuffer ExtendedCleaner. Lazily initialized */ + private static class DBB { + static final ExtendedCleaner INSTANCE = ExtendedCleaner.create(new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return AccessController.doPrivileged(new PrivilegedAction<>() { + @Override + public Thread run() { + Thread t = InnocuousThread.newSystemThread("DirectByteBuffer-Cleaner", r); + t.setPriority(Thread.MAX_PRIORITY - 2); + return t; + } + }); + } + }); + } /** * Cleaner for use within system modules. ! * <p> * This Cleaner will run on a thread whose context class loader * is {@code null}. The system cleaning action to perform in * this Cleaner should handle a {@code null} context class loader. * * @return a Cleaner for use within system modules */ public static Cleaner cleaner() { ! return Common.INSTANCE; ! } ! ! /** ! * ExtendedCleaner for DirectByteBuffer use. ! * <p> ! * This Cleaner will mostly run on a background thread whose ! * context class loader is {@code null}. But since this is ! * {@link ExtendedCleaner} it allows other threads to help executing ! * cleaning actions. Cleaning actions to be performed in this ExtendedCleaner ! * should handle a {@code null} context class loader and any application ! * thread. When they are executed by an application thread they are ! * executed in the context of {@link ReservedStackAccess} annotation. ! * ! * @return an ExtendedCleaner for use in DirectByteBuffer ! */ ! public static ExtendedCleaner dbbCleaner() { ! return DBB.INSTANCE; } }
< prev index next >