Home / Class/ ReferenceCountUpdater Class — netty Architecture

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

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