Skip to content

Instantly share code, notes, and snippets.

@nitsanw
Created October 21, 2016 11:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nitsanw/d59092ebbace552767466ba1fb1c97a5 to your computer and use it in GitHub Desktop.
Save nitsanw/d59092ebbace552767466ba1fb1c97a5 to your computer and use it in GitHub Desktop.
private E newBufferPoll(E[] buffer, final long index) {
final E[] newBuffer = lvNextArrayAndUnlink(buffer);
final long newMask = newBuffer.length - 2; // because buffer last element is for linking
// update consumer view on buffer
consumerBuffer = nextBuffer;
consumerMask = newMask;
// poll element, must be visible in new buffer
final long offsetInNew = calcElementOffset(index, newMask);
final E n = lvElement(newBuffer, offsetInNew); // volatile: n = nextBuffer[index&newMask];
if (null == n) {
throw new IllegalStateException("new buffer must have at least one element");
}
soConsumerIndex(index + 1); // ordered: consumerIdex = index + 1;
soElement(newBuffer, offsetInNew, null); // ordered: nextBuffer[index&newMask] = null;
return n;
}
protected final E[] lvNextArrayAndUnlink(E[] curr) {
final long nextArrayOffset = nextArrayOffset(curr);
final E[] nextBuffer = (E[]) lvElement(curr, nextArrayOffset);
// prevent GC nepotism
soElement(curr, nextArrayOffset, null);
return nextBuffer;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment