All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.firefly.net.tcp.secure.openssl.nativelib.CleanerJava6 Maven / Gradle / Ivy

There is a newer version: 5.0.0-dev6
Show newest version
package com.firefly.net.tcp.secure.openssl.nativelib;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.ByteBuffer;


/**
 * Allows to free direct {@link ByteBuffer} by using Cleaner. This is encapsulated in an extra class to be able
 * to use {@link PlatformDependent0} on Android without problems.
 * 

* For more details see #2604. */ final class CleanerJava6 implements Cleaner { private static final long CLEANER_FIELD_OFFSET; private static final Method CLEAN_METHOD; private static final Logger logger = LoggerFactory.getLogger("firefly-system"); static { long fieldOffset = -1; Method clean = null; Throwable error = null; if (PlatformDependent0.hasUnsafe()) { ByteBuffer direct = ByteBuffer.allocateDirect(1); try { Field cleanerField = direct.getClass().getDeclaredField("cleaner"); fieldOffset = PlatformDependent0.objectFieldOffset(cleanerField); Object cleaner = PlatformDependent0.getObject(direct, fieldOffset); clean = cleaner.getClass().getDeclaredMethod("clean"); clean.invoke(cleaner); } catch (Throwable t) { // We don't have ByteBuffer.cleaner(). fieldOffset = -1; clean = null; error = t; } } else { error = new UnsupportedOperationException("sun.misc.Unsafe unavailable"); } if (error == null) { logger.debug("java.nio.ByteBuffer.cleaner(): available"); } else { logger.debug("java.nio.ByteBuffer.cleaner(): unavailable", error); } CLEANER_FIELD_OFFSET = fieldOffset; CLEAN_METHOD = clean; } static boolean isSupported() { return CLEANER_FIELD_OFFSET != -1; } @Override public void freeDirectBuffer(ByteBuffer buffer) { if (!buffer.isDirect()) { return; } try { Object cleaner = PlatformDependent0.getObject(buffer, CLEANER_FIELD_OFFSET); if (cleaner != null) { CLEAN_METHOD.invoke(cleaner); } } catch (Throwable cause) { PlatformDependent0.throwException(cause); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy