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