From 1345233cf6df83e0d64687d0f7702f9b5a405b68 Mon Sep 17 00:00:00 2001 From: Francesco Nigro Date: Fri, 7 Sep 2018 22:55:28 +0200 Subject: [PATCH] Fixes #216: Size of SpscGrowableArrayQueue can exceeds max capacity Adjust producer limit in order to allow one more element to be added in place of the unneeded JUMP when the max capacity producer buffer has been allocated --- .../main/java/org/jctools/queues/SpscGrowableArrayQueue.java | 2 +- .../org/jctools/queues/atomic/SpscGrowableAtomicArrayQueue.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jctools-core/src/main/java/org/jctools/queues/SpscGrowableArrayQueue.java b/jctools-core/src/main/java/org/jctools/queues/SpscGrowableArrayQueue.java index 478c10f7..8be9b580 100644 --- a/jctools-core/src/main/java/org/jctools/queues/SpscGrowableArrayQueue.java +++ b/jctools-core/src/main/java/org/jctools/queues/SpscGrowableArrayQueue.java @@ -114,7 +114,7 @@ final boolean offerColdPath( long currConsumerIndex = lvConsumerIndex(); // use lookAheadStep to store the consumer distance from final buffer this.lookAheadStep = -(index - currConsumerIndex); - producerBufferLimit = currConsumerIndex + maxCapacity - 1; + producerBufferLimit = currConsumerIndex + maxCapacity; } else { diff --git a/jctools-core/src/main/java/org/jctools/queues/atomic/SpscGrowableAtomicArrayQueue.java b/jctools-core/src/main/java/org/jctools/queues/atomic/SpscGrowableAtomicArrayQueue.java index 89a8052e..323d045e 100644 --- a/jctools-core/src/main/java/org/jctools/queues/atomic/SpscGrowableAtomicArrayQueue.java +++ b/jctools-core/src/main/java/org/jctools/queues/atomic/SpscGrowableAtomicArrayQueue.java @@ -106,7 +106,7 @@ final boolean offerColdPath(final AtomicReferenceArray buffer, final long mas long currConsumerIndex = lvConsumerIndex(); // use lookAheadStep to store the consumer distance from final buffer this.lookAheadStep = -(index - currConsumerIndex); - producerBufferLimit = currConsumerIndex + maxCapacity - 1; + producerBufferLimit = currConsumerIndex + maxCapacity; } else { producerBufferLimit = index + producerMask - 1; adjustLookAheadStep(newCapacity);