summaryrefslogtreecommitdiff
path: root/lang/src/main/java/net/openhft/lang/io/IOTools.java
diff options
context:
space:
mode:
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.java27
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) {
+
+ }
+ }
}
}
}