--- old/src/java.base/share/classes/jdk/internal/misc/Unsafe.java 2018-11-01 19:08:10.000000000 -0700 +++ new/src/java.base/share/classes/jdk/internal/misc/Unsafe.java 2018-11-01 19:08:09.000000000 -0700 @@ -26,7 +26,9 @@ package jdk.internal.misc; import jdk.internal.HotSpotIntrinsicCandidate; +import jdk.internal.ref.Cleaner; import jdk.internal.vm.annotation.ForceInline; +import sun.nio.ch.DirectBuffer; import java.lang.reflect.Field; import java.security.ProtectionDomain; @@ -3718,6 +3720,29 @@ private native boolean isBigEndian0(); + /** + * Invokes the given direct byte buffer's cleaner, if any. + * + * @param directBuffer a direct byte buffer + * @throws NullPointerException if {@code directBuffer} is null + * @throws IllegalArgumentException if {@code directBuffer} is non-direct, + * or is a {@link java.nio.Buffer#slice slice}, or is a + * {@link java.nio.Buffer#duplicate duplicate} + */ + public void invokeCleaner(java.nio.ByteBuffer directBuffer) { + if (!directBuffer.isDirect()) + throw new IllegalArgumentException("buffer is non-direct"); + + DirectBuffer db = (DirectBuffer) directBuffer; + if (db.attachment() != null) + throw new IllegalArgumentException("duplicate or slice"); + + Cleaner cleaner = db.cleaner(); + if (cleaner != null) { + cleaner.clean(); + } + } + // The following deprecated methods are used by JSR 166. @Deprecated(since="12", forRemoval=true)