Home / Class/ AtomicRefCnt Class — netty Architecture

AtomicRefCnt Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  e71c7596_f8e0_1394_7485_74fd2ca83bf0["AtomicRefCnt"]
  532a5dc8_b6b3_1a54_7fbd_94734ca113fd["RefCnt.java"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|defined in| 532a5dc8_b6b3_1a54_7fbd_94734ca113fd
  e8916d83_fa4e_8b09_bf49_0684dc721f7e["init()"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|method| e8916d83_fa4e_8b09_bf49_0684dc721f7e
  b77484c0_5f5e_e415_d3d1_a3ca9414281f["refCnt()"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|method| b77484c0_5f5e_e415_d3d1_a3ca9414281f
  77b8114c_848a_3218_c7ac_72af15ed5a58["retain()"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|method| 77b8114c_848a_3218_c7ac_72af15ed5a58
  2f9c7e0d_83e1_98fc_1a83_b1192ccb6094["retain0()"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|method| 2f9c7e0d_83e1_98fc_1a83_b1192ccb6094
  b5c2ce00_3bce_c89b_b57a_5d368d2744bb["release()"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|method| b5c2ce00_3bce_c89b_b57a_5d368d2744bb
  f09c698a_6bc7_6ced_8737_2b648c1562a3["release0()"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|method| f09c698a_6bc7_6ced_8737_2b648c1562a3
  e0b0461f_97de_51b6_28f1_1e3cc280eae1["setRefCnt()"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|method| e0b0461f_97de_51b6_28f1_1e3cc280eae1
  d77cfcd8_a3dd_bc63_5192_3b89d3c076c5["resetRefCnt()"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|method| d77cfcd8_a3dd_bc63_5192_3b89d3c076c5
  065e7e3d_c04a_be25_3c09_f85fc66f9505["isLiveNonVolatile()"]
  e71c7596_f8e0_1394_7485_74fd2ca83bf0 -->|method| 065e7e3d_c04a_be25_3c09_f85fc66f9505

Relationship Graph

Source Code

common/src/main/java/io/netty/util/internal/RefCnt.java lines 242–313

    private static final class AtomicRefCnt {
        private static final AtomicIntegerFieldUpdater<RefCnt> UPDATER =
                AtomicIntegerFieldUpdater.newUpdater(RefCnt.class, "value");

        static void init(RefCnt instance) {
            UPDATER.set(instance, 2);
        }

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

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

        static void resetRefCnt(RefCnt instance) {
            UPDATER.lazySet(instance, 2);
        }

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

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free