Home / Class/ VarHandleRefCnt Class — netty Architecture

VarHandleRefCnt Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  f3598a09_a371_18eb_921b_dedcb34850b7["VarHandleRefCnt"]
  532a5dc8_b6b3_1a54_7fbd_94734ca113fd["RefCnt.java"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|defined in| 532a5dc8_b6b3_1a54_7fbd_94734ca113fd
  01a46729_2ade_f8fd_f6d7_b1b165232336["init()"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|method| 01a46729_2ade_f8fd_f6d7_b1b165232336
  fedd6eee_f626_d9ad_4b62_c78e7738baa3["refCnt()"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|method| fedd6eee_f626_d9ad_4b62_c78e7738baa3
  bfc7a3f3_f7b2_386a_dd1a_64aacd928e4b["retain()"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|method| bfc7a3f3_f7b2_386a_dd1a_64aacd928e4b
  87c0d5da_2856_f6c1_81a2_36cf52924564["retain0()"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|method| 87c0d5da_2856_f6c1_81a2_36cf52924564
  a224abec_8e5f_9344_ee42_9f6f016e1b28["release()"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|method| a224abec_8e5f_9344_ee42_9f6f016e1b28
  f2601aa0_4731_5bcb_b1a1_5c76b00280c1["release0()"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|method| f2601aa0_4731_5bcb_b1a1_5c76b00280c1
  6fa5576a_facc_5b89_ca85_38aaadf4c781["setRefCnt()"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|method| 6fa5576a_facc_5b89_ca85_38aaadf4c781
  d39a2975_fa6e_fa52_4c0c_534faa39ec9e["resetRefCnt()"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|method| d39a2975_fa6e_fa52_4c0c_534faa39ec9e
  150518bc_e096_7725_ae26_2e621724a844["isLiveNonVolatile()"]
  f3598a09_a371_18eb_921b_dedcb34850b7 -->|method| 150518bc_e096_7725_ae26_2e621724a844

Relationship Graph

Source Code

common/src/main/java/io/netty/util/internal/RefCnt.java lines 315–391

    private static final class VarHandleRefCnt {

        private static final VarHandle VH;

        static {
            VH = PlatformDependent.findVarHandleOfIntField(MethodHandles.lookup(), RefCnt.class, "value");
        }

        static void init(RefCnt instance) {
            VH.set(instance, 2);
            VarHandle.storeStoreFence();
        }

        static int refCnt(RefCnt instance) {
            return (int) VH.getAcquire(instance) >>> 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 = (int) VH.getAndAdd(instance, increment);
            if ((oldRef & 0x80000001) != 0 || oldRef > Integer.MAX_VALUE - increment) {
                VH.getAndAdd(instance, -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 = (int) VH.get(instance);
                if (curr == decrement) {
                    next = 1;
                } else {
                    if (curr < decrement || (curr & 1) == 1) {
                        throwIllegalRefCountOnRelease(decrement, curr);
                    }
                    next = curr - decrement;
                }
            } while (!(boolean) VH.compareAndSet(instance, curr, next));
            return (next & 1) == 1;
        }

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

        static void resetRefCnt(RefCnt instance) {
            VH.setRelease(instance, 2);
        }

        static boolean isLiveNonVolatile(RefCnt instance) {
            final int rawCnt = (int) VH.get(instance);
            if (rawCnt == 2) {
                return true;
            }
            return (rawCnt & 1) == 0;
        }
    }

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free