< 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 >