ReferenceCountUpdater Class — netty Architecture
Architecture documentation for the ReferenceCountUpdater class in ReferenceCountUpdater.java from the netty codebase.
Entity Profile
Dependency Diagram
graph TD f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682["ReferenceCountUpdater"] a30d1f16_458e_2460_d10e_96c48d3d48ef["ReferenceCountUpdater.java"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|defined in| a30d1f16_458e_2460_d10e_96c48d3d48ef 7349fd0f_df9f_8302_9ea7_ce440e4f8fcd["ReferenceCountUpdater()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 7349fd0f_df9f_8302_9ea7_ce440e4f8fcd 23f7dc9b_64ee_2ea1_62fc_f111debea501["safeInitializeRawRefCnt()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 23f7dc9b_64ee_2ea1_62fc_f111debea501 7bd59e63_4700_0b8e_7de1_61e888a6c74b["getAndAddRawRefCnt()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 7bd59e63_4700_0b8e_7de1_61e888a6c74b 59a2cd6a_9318_b154_f406_342a54f60b55["getRawRefCnt()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 59a2cd6a_9318_b154_f406_342a54f60b55 f2e4a103_2cb0_3d21_ce73_aae028177727["getAcquireRawRefCnt()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| f2e4a103_2cb0_3d21_ce73_aae028177727 117d86cd_c7dc_850b_7a44_c7f700f6fe7d["setReleaseRawRefCnt()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 117d86cd_c7dc_850b_7a44_c7f700f6fe7d 70ed524f_2bd6_7440_cd91_b03e06e3a597["casRawRefCnt()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 70ed524f_2bd6_7440_cd91_b03e06e3a597 9a92f852_41f5_5ab8_869b_43daea52454b["initialValue()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 9a92f852_41f5_5ab8_869b_43daea52454b 9c19e698_ea8d_34ea_d8ee_416658cf889c["setInitialValue()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 9c19e698_ea8d_34ea_d8ee_416658cf889c 53462359_5307_5504_1cac_1e94bf2d8fd1["realRefCnt()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 53462359_5307_5504_1cac_1e94bf2d8fd1 fadb715f_6819_548e_613f_1e96c4a3dd77["refCnt()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| fadb715f_6819_548e_613f_1e96c4a3dd77 2e08504e_a149_fdb1_1939_b82064c20df2["isLiveNonVolatile()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 2e08504e_a149_fdb1_1939_b82064c20df2 6f2e448e_e20d_1d9a_6546_a092ee5ea8e8["setRefCnt()"] f036d2ef_3ffa_eba6_5ed8_a93c1a7f1682 -->|method| 6f2e448e_e20d_1d9a_6546_a092ee5ea8e8
Relationship Graph
Source Code
common/src/main/java/io/netty/util/internal/ReferenceCountUpdater.java lines 28–168
@Deprecated
public abstract class ReferenceCountUpdater<T extends ReferenceCounted> {
/*
* Implementation notes:
*
* For the updated int field:
* Even => "real" refcount is (refCnt >>> 1)
* Odd => "real" refcount is 0
*/
protected ReferenceCountUpdater() {
}
protected abstract void safeInitializeRawRefCnt(T refCntObj, int value);
protected abstract int getAndAddRawRefCnt(T refCntObj, int increment);
protected abstract int getRawRefCnt(T refCnt);
protected abstract int getAcquireRawRefCnt(T refCnt);
protected abstract void setReleaseRawRefCnt(T refCnt, int value);
protected abstract boolean casRawRefCnt(T refCnt, int expected, int value);
public final int initialValue() {
return 2;
}
public final void setInitialValue(T instance) {
safeInitializeRawRefCnt(instance, initialValue());
}
private static int realRefCnt(int rawCnt) {
return rawCnt >>> 1;
}
public final int refCnt(T instance) {
return realRefCnt(getAcquireRawRefCnt(instance));
}
public final boolean isLiveNonVolatile(T instance) {
final int rawCnt = getRawRefCnt(instance);
if (rawCnt == 2) {
return true;
}
return (rawCnt & 1) == 0;
}
/**
* An unsafe operation that sets the reference count directly
*/
public final void setRefCnt(T instance, int refCnt) {
int rawRefCnt = refCnt > 0 ? refCnt << 1 : 1; // overflow OK here
setReleaseRawRefCnt(instance, rawRefCnt);
}
/**
* Resets the reference count to 1
*/
public final void resetRefCnt(T instance) {
// no need of a volatile set, it should happen in a quiescent state
setReleaseRawRefCnt(instance, initialValue());
}
public final T retain(T instance) {
return retain0(instance, 2);
}
public final T retain(T instance, int increment) {
return retain0(instance, checkPositive(increment, "increment") << 1);
}
private T retain0(T instance, int increment) {
int oldRef = getAndAddRawRefCnt(instance, 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
if ((oldRef & 0x80000001) != 0 || oldRef > Integer.MAX_VALUE - increment) {
getAndAddRawRefCnt(instance, -increment);
throw new IllegalReferenceCountException(0, increment >>> 1);
Source
Frequently Asked Questions
What is the ReferenceCountUpdater class?
ReferenceCountUpdater is a class in the netty codebase, defined in common/src/main/java/io/netty/util/internal/ReferenceCountUpdater.java.
Where is ReferenceCountUpdater defined?
ReferenceCountUpdater is defined in common/src/main/java/io/netty/util/internal/ReferenceCountUpdater.java at line 28.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free