Home / Class/ UnsafeRefCnt Class — netty Architecture

UnsafeRefCnt Class — netty Architecture

Architecture documentation for the UnsafeRefCnt class in RefCnt.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  a43fdad8_805c_4b48_edc8_5658c1df4216["UnsafeRefCnt"]
  532a5dc8_b6b3_1a54_7fbd_94734ca113fd["RefCnt.java"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|defined in| 532a5dc8_b6b3_1a54_7fbd_94734ca113fd
  5866299d_59b9_7020_58ee_4e9e800e1a98["getUnsafeOffset()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| 5866299d_59b9_7020_58ee_4e9e800e1a98
  0dd3d320_c2db_951d_f767_f2638e9a3685["init()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| 0dd3d320_c2db_951d_f767_f2638e9a3685
  374902fe_2879_012e_ab19_f1f5d43afcfa["refCnt()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| 374902fe_2879_012e_ab19_f1f5d43afcfa
  f2976590_e318_61b3_8ee1_df82a5fda531["retain()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| f2976590_e318_61b3_8ee1_df82a5fda531
  c7f19423_c5ad_a4f9_dc2f_3164b088e51a["retain0()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| c7f19423_c5ad_a4f9_dc2f_3164b088e51a
  346079bc_77d3_5e01_539a_40fefa12f03c["release()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| 346079bc_77d3_5e01_539a_40fefa12f03c
  7c45a31c_f889_4638_3f00_cf5b0cfdc195["release0()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| 7c45a31c_f889_4638_3f00_cf5b0cfdc195
  c88acdb3_75c3_7036_c3f6_c4809075c45e["setRefCnt()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| c88acdb3_75c3_7036_c3f6_c4809075c45e
  46e5c90e_7dbb_8672_3093_83b838ca17c5["resetRefCnt()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| 46e5c90e_7dbb_8672_3093_83b838ca17c5
  9bd9adbf_395c_5e93_a5eb_60f64bffe3a7["isLiveNonVolatile()"]
  a43fdad8_805c_4b48_edc8_5658c1df4216 -->|method| 9bd9adbf_395c_5e93_a5eb_60f64bffe3a7

Relationship Graph

Source Code

common/src/main/java/io/netty/util/internal/RefCnt.java lines 393–475

    private static final class UnsafeRefCnt {

        private static final long VALUE_OFFSET = getUnsafeOffset(RefCnt.class, "value");

        private static long getUnsafeOffset(Class<?> clz, String fieldName) {
            try {
                if (PlatformDependent.hasUnsafe()) {
                    return PlatformDependent.objectFieldOffset(clz.getDeclaredField(fieldName));
                }
            } catch (Throwable ignore) {
                // fall-back
            }
            return -1;
        }

        static void init(RefCnt instance) {
            PlatformDependent.safeConstructPutInt(instance, VALUE_OFFSET, 2);
        }

        static int refCnt(RefCnt instance) {
            return PlatformDependent.getVolatileInt(instance, VALUE_OFFSET) >>> 1;
        }

        static void retain(RefCnt instance) {
            retain0(instance, 2);
        }

        static void retain(RefCnt instance, int increment) {
            retain0(instance, checkPositive(increment, "increment") << 1);
        }

        private static void retain0(RefCnt instance, int increment) {
            // oldRef & 0x80000001 stands for oldRef < 0 || oldRef is odd
            // NOTE: we're optimizing for inlined and constant folded increment here -> which will make
            // Integer.MAX_VALUE - increment to be computed at compile time
            int oldRef = PlatformDependent.getAndAddInt(instance, VALUE_OFFSET, increment);
            if ((oldRef & 0x80000001) != 0 || oldRef > Integer.MAX_VALUE - increment) {
                PlatformDependent.getAndAddInt(instance, VALUE_OFFSET, -increment);
                throw new IllegalReferenceCountException(0, increment >>> 1);
            }
        }

        static boolean release(RefCnt instance) {
            return release0(instance, 2);
        }

        static boolean release(RefCnt instance, int decrement) {
            return release0(instance, checkPositive(decrement, "decrement") << 1);
        }

        private static boolean release0(RefCnt instance, int decrement) {
            int curr, next;
            do {
                curr = PlatformDependent.getInt(instance, VALUE_OFFSET);
                if (curr == decrement) {
                    next = 1;
                } else {
                    if (curr < decrement || (curr & 1) == 1) {
                        throwIllegalRefCountOnRelease(decrement, curr);
                    }
                    next = curr - decrement;
                }
            } while (!PlatformDependent.compareAndSwapInt(instance, VALUE_OFFSET, curr, next));
            return (next & 1) == 1;
        }

        static void setRefCnt(RefCnt instance, int refCnt) {
            int rawRefCnt = refCnt > 0? refCnt << 1 : 1;
            PlatformDependent.putOrderedInt(instance, VALUE_OFFSET, rawRefCnt);
        }

        static void resetRefCnt(RefCnt instance) {
            PlatformDependent.putOrderedInt(instance, VALUE_OFFSET, 2);
        }

        static boolean isLiveNonVolatile(RefCnt instance) {
            final int rawCnt = PlatformDependent.getInt(instance, VALUE_OFFSET);
            if (rawCnt == 2) {
                return true;
            }
            return (rawCnt & 1) == 0;

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free