Comments (3)
In case the capacity is power of 2, the following code I suggested in #45 should utilize the full capacity:
if (null == lvElement(buffer, calcElementOffset(index + 1, mask))) { // buffer is not full, keep last slot for resize indicator
return writeToQueue(buffer, e, index, offset);
} else if (mask == maxSize) {
if (null == lvElement(buffer, offset)) { // try using the last slot as there won't be any resize anymore
return writeToQueue(buffer, e, index, offset);
}
// we're full and can't grow
return false;
}
To fix the issue I would like to re-structure the queue such that a marker value is used to signal queue is full, but the link to next queue is pointed to in an extra slot.
What happens when the producer grows twice while the consumer is still in the first array?
Edit: I did some testing and the following test fails on the last assert:
@Test
public void testPowerOf2Capacity() {
int n = 128;
SpscGrowableArrayQueue<Integer> q = new SpscGrowableArrayQueue<>(8, n);
for (int i = 0; i < n; i++) {
assertTrue(q.offer(i));
}
assertFalse(q.offer(n));
}
The reason is that if the queue grows, the last grown array contains null in its front (up to index 62) and the producerLookAhead
is adjusted so that it points to array index 0. Even if there is no look-ahead, the next producerIndex will point to a null element and thus accepting the offer, making the effective queue capacity 243 elements (7 + 15 + 31 + 63 + 127).
from jctools.
Fixed and test added
from jctools.
Test below:
@Test
public void testPowerOf2Capacity() {
assumeThat(spec.isBounded(), is(true));
int n = Pow2.roundToPowerOfTwo(spec.capacity);
for (int i = 0; i < n; i++) {
assertTrue("Failed to insert:"+i,queue.offer(i));
}
assertFalse(queue.offer(n));
}
from jctools.
Related Issues (20)
- O(1) insertion, fully non-blocking data structure HOT 4
- Publish test jar as part of the release
- any plans on fitting virtual threads HOT 1
- Missing `Automatic-Module-Name` in 4.0.1 (regression) HOT 2
- Add a parallel `forEach()` method in `NonBlockingHashMap` HOT 2
- Counters probe can be negative (and shouldn't?) HOT 3
- Add copyright information HOT 1
- MpscBlockingConsumerArrayQueue need override clear() method to avoid blocking when queue is empty HOT 2
- NonBlockingHashMap's computeIfAbsentc has a bug in a multithreaded environment HOT 11
- about spmc broadcast problem HOT 2
- the way of MpscBlockingConsumerArrayQueue provide offerFirst? HOT 1
- BaseMpscLinkedArrayQueue.peek() causes 100% CPU util [problem in caller code] HOT 2
- (cIndex - pIndex) / 2 == 0 return null;If it is being expanded, wait a little while for the expansion to succeed, there will be a JUMP, and should not return null HOT 5
- Question: "Emulating" Guava's Queues.drain on SpscLinkedQueue HOT 3
- New release to include JPMS module changes
- src/main/java/org/jctools/maps/NonBlockingHashMap.java:1415: error: missing reference label HOT 2
- Maven central 4.0.2 jar is compiled to Java 8, no longer supporting java 7 HOT 2
- unexpected MpscBlockingConsumerArrayQueue polling timeout behavior
- Unpadded variants could avoid using Unsafe HOT 3
- a question about mspc buffer array index HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from jctools.