package io.netty.buffer;

/* JADX INFO: loaded from: classes.dex */
final class PoolSubpage<T> implements PoolSubpageMetric {
    static final /* synthetic */ boolean $assertionsDisabled = false;
    private final long[] bitmap;
    private int bitmapLength;
    final PoolChunk<T> chunk;
    boolean doNotDestroy;
    int elemSize;
    private int maxNumElems;
    private final int memoryMapIdx;
    PoolSubpage<T> next;
    private int nextAvail;
    private int numAvail;
    private final int pageSize;
    PoolSubpage<T> prev;
    private final int runOffset;

    PoolSubpage(int i2) {
        this.chunk = null;
        this.memoryMapIdx = -1;
        this.runOffset = -1;
        this.elemSize = -1;
        this.pageSize = i2;
        this.bitmap = null;
    }

    private void addToPool(PoolSubpage<T> poolSubpage) {
        this.prev = poolSubpage;
        PoolSubpage<T> poolSubpage2 = poolSubpage.next;
        this.next = poolSubpage2;
        poolSubpage2.prev = this;
        poolSubpage.next = this;
    }

    private int findNextAvail() {
        long[] jArr = this.bitmap;
        int i2 = this.bitmapLength;
        for (int i3 = 0; i3 < i2; i3++) {
            long j2 = jArr[i3];
            if (((-1) ^ j2) != 0) {
                return findNextAvail0(i3, j2);
            }
        }
        return -1;
    }

    private int findNextAvail0(int i2, long j2) {
        int i3 = this.maxNumElems;
        int i4 = i2 << 6;
        for (int i5 = 0; i5 < 64; i5++) {
            if ((1 & j2) == 0) {
                int i6 = i4 | i5;
                if (i6 < i3) {
                    return i6;
                }
                return -1;
            }
            j2 >>>= 1;
        }
        return -1;
    }

    private int getNextAvail() {
        int i2 = this.nextAvail;
        if (i2 < 0) {
            return findNextAvail();
        }
        this.nextAvail = -1;
        return i2;
    }

    private void removeFromPool() {
        PoolSubpage<T> poolSubpage = this.prev;
        poolSubpage.next = this.next;
        this.next.prev = poolSubpage;
        this.next = null;
        this.prev = null;
    }

    private void setNextAvail(int i2) {
        this.nextAvail = i2;
    }

    private long toHandle(int i2) {
        return (((long) i2) << 32) | 4611686018427387904L | ((long) this.memoryMapIdx);
    }

    long allocate() {
        if (this.elemSize == 0) {
            return toHandle(0);
        }
        if (this.numAvail == 0 || !this.doNotDestroy) {
            return -1L;
        }
        int nextAvail = getNextAvail();
        int i2 = nextAvail >>> 6;
        long[] jArr = this.bitmap;
        jArr[i2] = jArr[i2] | (1 << (nextAvail & 63));
        int i3 = this.numAvail - 1;
        this.numAvail = i3;
        if (i3 == 0) {
            removeFromPool();
        }
        return toHandle(nextAvail);
    }

    @Override // io.netty.buffer.PoolSubpageMetric
    public int elementSize() {
        return this.elemSize;
    }

    boolean free(PoolSubpage<T> poolSubpage, int i2) {
        if (this.elemSize == 0) {
            return true;
        }
        int i3 = i2 >>> 6;
        long[] jArr = this.bitmap;
        jArr[i3] = jArr[i3] ^ (1 << (i2 & 63));
        setNextAvail(i2);
        int i4 = this.numAvail;
        int i5 = i4 + 1;
        this.numAvail = i5;
        if (i4 == 0) {
            addToPool(poolSubpage);
            return true;
        }
        if (i5 != this.maxNumElems || this.prev == this.next) {
            return true;
        }
        this.doNotDestroy = false;
        removeFromPool();
        return false;
    }

    void init(PoolSubpage<T> poolSubpage, int i2) {
        this.doNotDestroy = true;
        this.elemSize = i2;
        if (i2 != 0) {
            int i3 = this.pageSize / i2;
            this.numAvail = i3;
            this.maxNumElems = i3;
            this.nextAvail = 0;
            int i4 = i3 >>> 6;
            this.bitmapLength = i4;
            if ((i3 & 63) != 0) {
                this.bitmapLength = i4 + 1;
            }
            for (int i5 = 0; i5 < this.bitmapLength; i5++) {
                this.bitmap[i5] = 0;
            }
        }
        addToPool(poolSubpage);
    }

    @Override // io.netty.buffer.PoolSubpageMetric
    public int maxNumElements() {
        return this.maxNumElems;
    }

    @Override // io.netty.buffer.PoolSubpageMetric
    public int numAvailable() {
        return this.numAvail;
    }

    @Override // io.netty.buffer.PoolSubpageMetric
    public int pageSize() {
        return this.pageSize;
    }

    public String toString() {
        if (!this.doNotDestroy) {
            return "(" + this.memoryMapIdx + ": not in use)";
        }
        return String.valueOf('(') + this.memoryMapIdx + ": " + (this.maxNumElems - this.numAvail) + '/' + this.maxNumElems + ", offset: " + this.runOffset + ", length: " + this.pageSize + ", elemSize: " + this.elemSize + ')';
    }

    PoolSubpage(PoolSubpage<T> poolSubpage, PoolChunk<T> poolChunk, int i2, int i3, int i4, int i5) {
        this.chunk = poolChunk;
        this.memoryMapIdx = i2;
        this.runOffset = i3;
        this.pageSize = i4;
        this.bitmap = new long[i4 >>> 10];
        init(poolSubpage, i5);
    }
}
