Home / Class/ CleanerJava6 Class — netty Architecture

CleanerJava6 Class — netty Architecture

Architecture documentation for the CleanerJava6 class in CleanerJava6.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  1564949e_7b20_a607_8b35_54b91bcfcece["CleanerJava6"]
  1313fbb4_7691_cc11_ef24_993589287c1d["CleanerJava6.java"]
  1564949e_7b20_a607_8b35_54b91bcfcece -->|defined in| 1313fbb4_7691_cc11_ef24_993589287c1d
  17626e33_5ee6_5132_a2dd_7696ba0280af["isSupported()"]
  1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 17626e33_5ee6_5132_a2dd_7696ba0280af
  fd9c73ce_3ed7_14a1_93a9_d0928cad6b59["CleanableDirectBuffer()"]
  1564949e_7b20_a607_8b35_54b91bcfcece -->|method| fd9c73ce_3ed7_14a1_93a9_d0928cad6b59
  7a35b26c_a314_57c4_a25b_7bd583e69091["freeDirectBuffer()"]
  1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 7a35b26c_a314_57c4_a25b_7bd583e69091
  982894c8_322b_1556_6f75_75e35426ea7a["freeDirectBufferStatic()"]
  1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 982894c8_322b_1556_6f75_75e35426ea7a
  1ba54708_ba19_1616_dd30_41ba2b85f301["freeDirectBufferPrivileged()"]
  1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 1ba54708_ba19_1616_dd30_41ba2b85f301
  64a7314f_e672_b2e8_8c8b_dbb105cac971["freeDirectBuffer0()"]
  1564949e_7b20_a607_8b35_54b91bcfcece -->|method| 64a7314f_e672_b2e8_8c8b_dbb105cac971

Relationship Graph

Source Code

common/src/main/java/io/netty/util/internal/CleanerJava6.java lines 36–166

final class CleanerJava6 implements Cleaner {
    private static final MethodHandle CLEAN_METHOD;

    private static final InternalLogger logger = InternalLoggerFactory.getInstance(CleanerJava6.class);

    static {
        MethodHandle clean;
        Throwable error = null;
        final ByteBuffer direct = ByteBuffer.allocateDirect(1);
        try {
            Object mayBeCleanerField = AccessController.doPrivileged(new PrivilegedAction<Object>() {
                @Override
                public Object run() {
                    try {
                        Class<?> cleanerClass = Class.forName("sun.misc.Cleaner");
                        Class<?> directBufClass = Class.forName("sun.nio.ch.DirectBuffer");
                        MethodHandles.Lookup lookup = MethodHandles.lookup();

                        // Call clean() on the cleaner
                        MethodHandle clean = lookup.findVirtual(
                                cleanerClass, "clean", methodType(void.class));
                        // But only if the cleaner is non-null
                        MethodHandle nullTest = lookup.findStatic(
                                Objects.class, "nonNull", methodType(boolean.class, Object.class));
                        clean = MethodHandles.guardWithTest(
                                nullTest.asType(methodType(boolean.class, cleanerClass)),
                                clean,
                                nullTest.asType(methodType(void.class, cleanerClass)));
                        // Change receiver to DirectBuffer, convert DirectBuffer to Cleaner by calling cleaner()
                        clean = MethodHandles.filterArguments(clean, 0, lookup.findVirtual(
                                directBufClass,
                                "cleaner",
                                methodType(cleanerClass)));
                        // Change receiver to ByteBuffer, convert using explicit cast to DirectBuffer
                        clean = MethodHandles.explicitCastArguments(clean,
                                methodType(void.class, ByteBuffer.class));
                        return clean;
                    } catch (Throwable cause) {
                        return cause;
                    }
                }
            });
            if (mayBeCleanerField instanceof Throwable) {
                throw (Throwable) mayBeCleanerField;
            }

            clean = (MethodHandle) mayBeCleanerField;
            clean.invokeExact(direct);
        } catch (Throwable t) {
            // We don't have ByteBuffer.cleaner().
            clean = null;
            error = t;
        }

        if (error == null) {
            logger.debug("java.nio.ByteBuffer.cleaner(): available");
        } else {
            logger.debug("java.nio.ByteBuffer.cleaner(): unavailable", error);
        }
        CLEAN_METHOD = clean;
    }

    static boolean isSupported() {
        return CLEAN_METHOD != null;
    }

    @Override
    public CleanableDirectBuffer allocate(int capacity) {
        return new CleanableDirectBufferImpl(ByteBuffer.allocateDirect(capacity));
    }

    @Deprecated
    @Override
    public void freeDirectBuffer(ByteBuffer buffer) {
        freeDirectBufferStatic(buffer);
    }

    private static void freeDirectBufferStatic(ByteBuffer buffer) {
        if (!buffer.isDirect()) {
            return;
        }

Frequently Asked Questions

What is the CleanerJava6 class?
CleanerJava6 is a class in the netty codebase, defined in common/src/main/java/io/netty/util/internal/CleanerJava6.java.
Where is CleanerJava6 defined?
CleanerJava6 is defined in common/src/main/java/io/netty/util/internal/CleanerJava6.java at line 36.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free