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