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;
}
}
Source
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