private Object spinWaitForElement(E[] buffer, long offset) { Object e; do { e = lvElement(buffer, offset); } while (e == null); return e; }
private E spinForElement(final E[] buffer, long offset) { E e; do { e = lvElement(buffer, offset); } while (e == null); return e; }
private E newBufferPeek(E[] nextBuffer, long index) { final long offset = newBufferAndOffset(nextBuffer, index); final E n = lvElement(nextBuffer, offset);// LoadLoad if (null == n) { throw new IllegalStateException("new buffer must have at least one element"); } return n; }
private boolean containsSlowPath(final E[] buffer, final long mask, final int hash, Object needle) { for (int i = hash + 1; i <= hash + mask; i++) { final long offset = calcElementOffset(i, mask); final E e = lvElement(buffer, offset); if (e == null) { return false; } else if (needle.equals(e)) { return true; } } return false; }
@Override public E relaxedPeek() { final E[] buffer = consumerBuffer; final long index = lpConsumerIndex(); final long mask = consumerMask; final long offset = modifiedCalcElementOffset(index, mask); E e = lvElement(buffer, offset);// LoadLoad return e; }
@Override public E peek() { long currentHead = lvProducerIndex(); return lvElement(buffer, calcElementOffset(currentHead)); }
@Override public E relaxedPeek() { final E[] buffer = this.buffer; final long mask = this.mask; final long cIndex = lpConsumerIndex(); return lvElement(buffer, calcElementOffset(cIndex, mask)); }
@SuppressWarnings("unchecked") private E[] getNextBuffer(final E[] buffer, final long mask) { final long offset = nextArrayOffset(mask); final E[] nextBuffer = (E[]) lvElement(buffer, offset); soElement(buffer, offset, null); return nextBuffer; }
@Override public E relaxedPeek() { final long consumerPosition = lpConsumerPosition(); final long mask = this.mask; final long offset = circularArrayOffset(consumerPosition, mask); return lvElement(this.buffer, offset); }
@Override public E relaxedPeek() { final E[] buffer = this.buffer; final long mask = this.mask; final long consumerIndex = lvConsumerIndex(); return lvElement(buffer, calcElementOffset(consumerIndex, mask)); }
@SuppressWarnings("unchecked") protected final E[] lvNextArrayAndUnlink(E[] curr) { final long offset = nextArrayOffset(curr); final E[] nextBuffer = (E[]) lvElement(curr, offset); // prevent GC nepotism soElement(curr, offset, null); return nextBuffer; }
/** * {@inheritDoc} * <p> * This implementation is correct for single consumer thread use only. */ @Override public E peek() { return lvElement(buffer, calcElementOffset(lpConsumerIndex())); }
@Override public E poll() { long cIndex = this.cIndex; final long offset = calcElementOffset(cIndex); final E[] lb = buffer; final E e = lvElement(lb, offset); // write acquire if (null == e) { return null; } soElement(lb, offset, null); // read release this.cIndex = cIndex + 1; return e; }
private boolean containsImpl(Object needle) { // contains takes a snapshot of the buffer. final E[] buffer = this.buffer; final long mask = buffer.length - 1; final int hash = rehash(needle.hashCode()); long offset = calcElementOffset(hash, mask); final E e = lvElement(buffer, offset); if (e == null) { return false; } else if (needle.equals(e)) { return true; } return containsSlowPath(buffer, mask, hash, needle); }
private E newBufferPoll(E[] nextBuffer, long index) { final long offset = newBufferAndOffset(nextBuffer, index); final E n = lvElement(nextBuffer, offset);// LoadLoad if (n == null) { throw new IllegalStateException("new buffer must have at least one element"); } soElement(nextBuffer, offset, null);// StoreStore soConsumerIndex(index + 2); return n; }
private E newBufferPeek(final E[] buffer, final long index) { E[] nextBuffer = lvNextArrayAndUnlink(buffer); consumerBuffer = nextBuffer; final long mask = length(nextBuffer) - 2; consumerMask = mask; final long offset = calcElementOffset(index, mask); return lvElement(nextBuffer, offset);// LoadLoad }
@Override public E peek() { final E[] buffer = this.buffer; final long consumerPosition = lpConsumerPosition(); final long offset = circularArrayOffset(consumerPosition, this.mask); E e = lvElement(buffer, offset); if (null == e) { return peekSlowPath(buffer, consumerPosition, offset); } return e; }
@Override public E relaxedPoll() { final long consumerPosition = lpConsumerPosition(); final long offset = circularArrayOffset(consumerPosition, this.mask); final E[] buffer = this.buffer; final E e = lvElement(buffer, offset); if (e != null) { signalConsumerProgress(consumerPosition, buffer, offset); } return e; }
@Override public E poll() { final long consumerPosition = lpConsumerPosition(); final long offset = circularArrayOffset(consumerPosition, this.mask); final E[] buffer = this.buffer; final E e = lvElement(buffer, offset); if (null == e) { return pollSlowPath(buffer, offset, consumerPosition); } signalConsumerProgress(consumerPosition, buffer, offset); return e; }
@SuppressWarnings("unchecked") @Override public E relaxedPeek() { final E[] buffer = consumerBuffer; final long index = lpConsumerIndex(); final long mask = consumerMask; final long offset = modifiedCalcElementOffset(index, mask); Object e = lvElement(buffer, offset);// LoadLoad if (e == JUMP) { return newBufferPeek(getNextBuffer(buffer, mask), index); } return (E) e; }