< prev index next >

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

Print this page

        

@@ -24,10 +24,11 @@
  */
 
 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,12 +37,13 @@
  * 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() {
+    /* 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,19 +52,54 @@
                     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 commonCleaner;
+        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 >