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

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

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

import org.jctools.util.UnsafeAccess;

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

public class UnPaddedLockFreeArrayQueue1 extends AbstractLockFreeArrayQueue {

    private volatile int head;
    private static final long OFFSET_HEAD = UnsafeAccess.fieldOffset(UnPaddedLockFreeArrayQueue1.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;
    private static final long OFFSET_STATE = UnsafeAccess.fieldOffset(UnPaddedLockFreeArrayQueue1.class, "stTail");
    private volatile Object[] elements;

    public UnPaddedLockFreeArrayQueue1(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 UnsafeAccess.UNSAFE.compareAndSwapInt(this, OFFSET_HEAD, 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() {
        stTail = ST_TAIL_READY;
    }

    @Override
    protected boolean tryStartRead() {
        return UnsafeAccess.UNSAFE.compareAndSwapInt(this, OFFSET_STATE, ST_TAIL_READY, ST_TAIL_READ);
    }

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

    @Override
    protected boolean tryStartWrite() {
        return UnsafeAccess.UNSAFE.compareAndSwapInt(this, OFFSET_STATE, ST_TAIL_READY, ST_TAIL_WRITE);
    }

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

    @Override
    protected boolean tryStartGrow() {
        return UnsafeAccess.UNSAFE.compareAndSwapInt(this, OFFSET_STATE, 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