Skip to content

Commit 4d793a0

Browse files
committed
use reflection instead of relying on sun.misc.Cleaner being available.
1 parent cac0a17 commit 4d793a0

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

src/com/esotericsoftware/kryo/util/UnsafeUtil.java

+20-6
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323

2424
import java.lang.reflect.Constructor;
2525
import java.lang.reflect.Field;
26+
import java.lang.reflect.Method;
2627
import java.nio.ByteBuffer;
2728
import java.util.Arrays;
2829
import java.util.Comparator;
2930
import java.util.List;
3031

31-
import sun.misc.Cleaner;
3232
import sun.misc.Unsafe;
3333
import sun.nio.ch.DirectBuffer;
3434

@@ -92,6 +92,18 @@ public class UnsafeUtil {
9292
_unsafe = tmpUnsafe;
9393
}
9494

95+
static private Method cleanerMethod, cleanMethod;
96+
static {
97+
try {
98+
cleanerMethod = DirectBuffer.class.getMethod("cleaner");
99+
cleanerMethod.setAccessible(true);
100+
cleanMethod = cleanerMethod.getReturnType().getMethod("clean");
101+
} catch (Exception ex) {
102+
if (DEBUG) debug("kryo", "No direct ByteBuffer clean method is available.", ex);
103+
cleanerMethod = null;
104+
}
105+
}
106+
95107
static {
96108
ByteBuffer buf = ByteBuffer.allocateDirect(1);
97109
try {
@@ -154,11 +166,13 @@ final static public ByteBuffer getDirectBufferAt (long address, int size) {
154166
*
155167
* NOTE: If Cleaner is not accessible due to SecurityManager restrictions, reflection could be used to obtain the "clean"
156168
* method and then invoke it. */
157-
static public void releaseBuffer (ByteBuffer niobuffer) {
158-
if (niobuffer != null && niobuffer.isDirect()) {
159-
Object cleaner = ((DirectBuffer)niobuffer).cleaner();
160-
if (cleaner != null) ((Cleaner)cleaner).clean();
161-
niobuffer = null;
169+
static public void releaseBuffer (ByteBuffer buffer) {
170+
if (!(buffer instanceof DirectBuffer)) return;
171+
if (cleanerMethod != null) {
172+
try {
173+
cleanMethod.invoke(cleanerMethod.invoke(buffer));
174+
} catch (Throwable ignored) {
175+
}
162176
}
163177
}
164178
}

0 commit comments

Comments
 (0)