netty5/src/main/java/org/jboss/netty/util/internal/ByteBufferUtil.java

72 lines
2.4 KiB
Java

/*
* Copyright 2012 The Netty Project
*
* The Netty Project licenses this file to you under the Apache License,
* version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package org.jboss.netty.util.internal;
import java.lang.reflect.Method;
import java.nio.ByteBuffer;
/**
* This is fork of ElasticSearch's ByteBufferAllocator.Cleaner class
*/
public final class ByteBufferUtil {
private static final boolean CLEAN_SUPPORTED;
private static final Method directBufferCleaner;
private static final Method directBufferCleanerClean;
static {
Method directBufferCleanerX = null;
Method directBufferCleanerCleanX = null;
boolean v;
try {
ByteBuffer direct = ByteBuffer.allocateDirect(1);
directBufferCleanerX = direct.getClass().getMethod("cleaner");
directBufferCleanerX.setAccessible(true);
Object cleaner = directBufferCleanerX.invoke(direct);
try {
Runnable runnable = (Runnable) cleaner;
directBufferCleanerCleanX = Runnable.class.getDeclaredMethod("run");
} catch (ClassCastException ignored) {
directBufferCleanerCleanX = cleaner.getClass().getMethod("clean");
}
directBufferCleanerCleanX.invoke(cleaner);
v = true;
} catch (Exception e) {
v = false;
}
CLEAN_SUPPORTED = v;
directBufferCleaner = directBufferCleanerX;
directBufferCleanerClean = directBufferCleanerCleanX;
}
/**
* Destroy the given {@link ByteBuffer} if possible
*/
public static void destroy(ByteBuffer buffer) {
if (CLEAN_SUPPORTED && buffer.isDirect()) {
try {
Object cleaner = directBufferCleaner.invoke(buffer);
directBufferCleanerClean.invoke(cleaner);
} catch (Exception e) {
// silently ignore exception
}
}
}
private ByteBufferUtil() {
// Utility class
}
}