[#1792] PlatformDependent.freeDirectBuffer(..) now respect hasUnsafe()
This commit is contained in:
parent
b669237bac
commit
088551db9c
@ -228,7 +228,11 @@ public final class PlatformDependent {
|
||||
*/
|
||||
public static void freeDirectBuffer(ByteBuffer buffer) {
|
||||
if (buffer.isDirect()) {
|
||||
PlatformDependent0.freeDirectBuffer(buffer);
|
||||
if (hasUnsafe()) {
|
||||
PlatformDependent0.freeDirectBufferUnsafe(buffer);
|
||||
} else {
|
||||
PlatformDependent0.freeDirectBuffer(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -37,6 +37,7 @@ final class PlatformDependent0 {
|
||||
|
||||
private static final long CLEANER_FIELD_OFFSET;
|
||||
private static final long ADDRESS_FIELD_OFFSET;
|
||||
private static final Field CLEANER_FIELD;
|
||||
|
||||
/**
|
||||
* {@code true} if and only if the platform supports unaligned access.
|
||||
@ -56,6 +57,7 @@ final class PlatformDependent0 {
|
||||
} catch (Throwable t) {
|
||||
cleanerField = null;
|
||||
}
|
||||
CLEANER_FIELD = cleanerField;
|
||||
logger.debug("java.nio.ByteBuffer.cleaner: {}", cleanerField != null? "available" : "unavailable");
|
||||
|
||||
Field addressField;
|
||||
@ -145,7 +147,7 @@ final class PlatformDependent0 {
|
||||
UNSAFE.throwException(t);
|
||||
}
|
||||
|
||||
static void freeDirectBuffer(ByteBuffer buffer) {
|
||||
static void freeDirectBufferUnsafe(ByteBuffer buffer) {
|
||||
Cleaner cleaner;
|
||||
try {
|
||||
cleaner = (Cleaner) getObject(buffer, CLEANER_FIELD_OFFSET);
|
||||
@ -159,6 +161,22 @@ final class PlatformDependent0 {
|
||||
}
|
||||
}
|
||||
|
||||
static void freeDirectBuffer(ByteBuffer buffer) {
|
||||
if (CLEANER_FIELD == null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
Cleaner cleaner = (Cleaner) CLEANER_FIELD.get(buffer);
|
||||
if (cleaner == null) {
|
||||
throw new IllegalArgumentException(
|
||||
"attempted to deallocate the buffer which was allocated via JNIEnv->NewDirectByteBuffer()");
|
||||
}
|
||||
cleaner.clean();
|
||||
} catch (Throwable t) {
|
||||
// Nothing we can do here.
|
||||
}
|
||||
}
|
||||
|
||||
static long directBufferAddress(ByteBuffer buffer) {
|
||||
return getLong(buffer, ADDRESS_FIELD_OFFSET);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user