< prev index next >

src/java.base/share/classes/java/nio/Bits.java

Print this page

        

@@ -30,10 +30,12 @@
 import jdk.internal.misc.JavaNioAccess;
 import jdk.internal.misc.JavaLangRefAccess;
 import jdk.internal.misc.SharedSecrets;
 import jdk.internal.misc.Unsafe;
 import jdk.internal.misc.VM;
+import jdk.internal.ref.CleanerFactory;
+import jdk.internal.ref.CleanerImpl;
 
 /**
  * Access to bits, native and otherwise.
  */
 

@@ -624,14 +626,16 @@
             return;
         }
 
         final JavaLangRefAccess jlra = SharedSecrets.getJavaLangRefAccess();
 
-        // retry while helping enqueue pending Reference objects
-        // which includes executing pending Cleaner(s) which includes
-        // Cleaner(s) that free direct buffer memory
-        while (jlra.tryHandlePendingReference()) {
+        // retry while:
+        // - helping enqueue pending Reference objects which includes Cleanable(s)
+        // - helping processing the queue of Cleanable(s) which includes the ones
+        //   that free direct buffer memory
+        while (jlra.tryHandlePendingReference() | // use non-short-circuit or
+               CleanerImpl.getCleanerImpl(CleanerFactory.cleaner()).drainQueue()) {
             if (tryReserveMemory(size, cap)) {
                 return;
             }
         }
 

@@ -649,11 +653,12 @@
                     return;
                 }
                 if (sleeps >= MAX_SLEEPS) {
                     break;
                 }
-                if (!jlra.tryHandlePendingReference()) {
+                if (!jlra.tryHandlePendingReference() & // use non-short-circuit and
+                    !CleanerImpl.getCleanerImpl(CleanerFactory.cleaner()).drainQueue()) {
                     try {
                         Thread.sleep(sleepTime);
                         sleepTime <<= 1;
                         sleeps++;
                     } catch (InterruptedException e) {
< prev index next >