diff options
Diffstat (limited to 'lang/src/main/java/net/openhft/lang/io/IOTools.java')
-rw-r--r-- | lang/src/main/java/net/openhft/lang/io/IOTools.java | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/lang/src/main/java/net/openhft/lang/io/IOTools.java b/lang/src/main/java/net/openhft/lang/io/IOTools.java index b87cb68..5e9f477 100644 --- a/lang/src/main/java/net/openhft/lang/io/IOTools.java +++ b/lang/src/main/java/net/openhft/lang/io/IOTools.java @@ -19,8 +19,8 @@ package net.openhft.lang.io; import net.openhft.lang.model.constraints.NotNull; import net.openhft.lang.model.constraints.Nullable; import org.slf4j.LoggerFactory; -import sun.misc.Cleaner; import sun.nio.ch.DirectBuffer; +import sun.misc.Unsafe; import java.io.Closeable; import java.io.File; @@ -28,6 +28,8 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.lang.reflect.Method; + /** * @author peter.lawrey */ @@ -35,6 +37,19 @@ public enum IOTools { ; public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); public static final Charset UTF_8 = Charset.forName("UTF-8"); + private static final Unsafe unsafe = NativeBytes.UNSAFE; + private static final Method invokeCleaner; + + static { + Method tmpCleaner; + try { + tmpCleaner = unsafe.getClass().getDeclaredMethod("invokeCleaner", ByteBuffer.class); + tmpCleaner.setAccessible(true); + } catch (Throwable t) { + tmpCleaner = null; + } + invokeCleaner = tmpCleaner; + } public static void close(@Nullable Closeable closeable) { if (closeable == null) return; @@ -82,9 +97,13 @@ public enum IOTools { public static void clean(ByteBuffer bb) { if (bb instanceof DirectBuffer) { - Cleaner cl = ((DirectBuffer) bb).cleaner(); - if (cl != null) - cl.clean(); + if (invokeCleaner != null) { + try { + invokeCleaner.invoke(unsafe, bb); + } catch (Throwable e) { + + } + } } } } |