All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.vipcxj.jasync.ng.runtime.utils.UnPaddedLockFreeArrayQueue0 Maven / Gradle / Ivy

package io.github.vipcxj.jasync.ng.runtime.utils;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

import static io.github.vipcxj.jasync.ng.runtime.utils.CommonUtils.normalCapacity;

public class UnPaddedLockFreeArrayQueue0 extends AbstractLockFreeArrayQueue {

    private volatile int head;
    @SuppressWarnings("rawtypes")
    private static final AtomicIntegerFieldUpdater HEAD = AtomicIntegerFieldUpdater.newUpdater(UnPaddedLockFreeArrayQueue0.class, "head");
    private volatile int tail;
    private volatile int stTail;
    private static final int ST_TAIL_READY = 0;
    private static final int ST_TAIL_READ = 1;
    private static final int ST_TAIL_WRITE = 2;
    private static final int ST_TAIL_GROW = 3;
    @SuppressWarnings("rawtypes")
    private static final AtomicIntegerFieldUpdater ST_TAIL = AtomicIntegerFieldUpdater.newUpdater(UnPaddedLockFreeArrayQueue0.class, "stTail");
    private volatile Object[] elements;

    public UnPaddedLockFreeArrayQueue0(int initCapacity) {
        int capacity = normalCapacity(initCapacity);
        this.elements = new Object[capacity];
        this.head = this.tail = 0;
        this.stTail = ST_TAIL_READY;
    }

    @Override
    protected int head() {
        return head;
    }

    @Override
    protected boolean tryIncHead(int head) {
        return HEAD.weakCompareAndSet(this, head, head + 1);
    }

    @Override
    protected int tail() {
        return tail;
    }

    @Override
    protected int getAndIncTail() {
        //noinspection NonAtomicOperationOnVolatileField
        return tail++;
    }

    @Override
    protected void resetHeadAndTail() {
        head = tail = 0;
    }

    @Override
    protected Object[] elements() {
        return elements;
    }

    @Override
    protected void elements(Object[] array) {
        elements = array;
    }

    @Override
    public int capacity() {
        return elements.length;
    }

    private void resetState() {
        ST_TAIL.set(this, ST_TAIL_READY);
    }

    @Override
    protected boolean tryStartRead() {
        return ST_TAIL.weakCompareAndSet(this, ST_TAIL_READY, ST_TAIL_READ);
    }

    @Override
    protected void endRead() {
        resetState();
    }

    @Override
    protected boolean tryStartWrite() {
        return ST_TAIL.weakCompareAndSet(this, ST_TAIL_READY, ST_TAIL_WRITE);
    }

    @Override
    protected void endWrite() {
        resetState();
    }

    @Override
    protected boolean tryStartGrow() {
        return ST_TAIL.weakCompareAndSet(this, ST_TAIL_READY, ST_TAIL_GROW);
    }

    @Override
    protected void endGrow() {
        resetState();
    }

    @Override
    protected boolean isStateReady() {
        return stTail == ST_TAIL_READY;
    }

    @Override
    protected boolean isGrowing() {
        return stTail == ST_TAIL_GROW;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy