diff --git a/jctools-core/src/main/java/org/jctools/queues/BaseLinkedQueue.java b/jctools-core/src/main/java/org/jctools/queues/BaseLinkedQueue.java index c1720e1e..23ed03db 100644 --- a/jctools-core/src/main/java/org/jctools/queues/BaseLinkedQueue.java +++ b/jctools-core/src/main/java/org/jctools/queues/BaseLinkedQueue.java @@ -87,6 +87,11 @@ protected final LinkedQueueNode lpConsumerNode() { } } +abstract class BaseLinkedQueuePad2 extends BaseLinkedQueueConsumerNodeRef { + long p01, p02, p03, p04, p05, p06, p07; + long p10, p11, p12, p13, p14, p15, p16, p17; +} + /** * A base data structure for concurrent linked queues. For convenience also pulled in common single consumer * methods since at this time there's no plan to implement MC. @@ -95,9 +100,7 @@ protected final LinkedQueueNode lpConsumerNode() { * * @param */ -abstract class BaseLinkedQueue extends BaseLinkedQueueConsumerNodeRef { - long p01, p02, p03, p04, p05, p06, p07; - long p10, p11, p12, p13, p14, p15, p16, p17; +abstract class BaseLinkedQueue extends BaseLinkedQueuePad2 { @Override public final Iterator iterator() { diff --git a/jctools-core/src/main/java/org/jctools/queues/atomic/BaseLinkedAtomicQueue.java b/jctools-core/src/main/java/org/jctools/queues/atomic/BaseLinkedAtomicQueue.java index f5de735c..ce8f2821 100644 --- a/jctools-core/src/main/java/org/jctools/queues/atomic/BaseLinkedAtomicQueue.java +++ b/jctools-core/src/main/java/org/jctools/queues/atomic/BaseLinkedAtomicQueue.java @@ -19,13 +19,63 @@ import org.jctools.queues.MessagePassingQueue; -abstract class BaseLinkedAtomicQueue extends AbstractQueue { - private static final AtomicReferenceFieldUpdater P_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(BaseLinkedAtomicQueue.class, LinkedQueueAtomicNode.class, "producerNode"); - private static final AtomicReferenceFieldUpdater C_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(BaseLinkedAtomicQueue.class, LinkedQueueAtomicNode.class, "consumerNode"); +abstract class BaseLinkedAtomicQueuePad0 extends AbstractQueue { + long p00, p01, p02, p03, p04, p05, p06, p07; + long p10, p11, p12, p13, p14, p15, p16; +} + +abstract class BaseLinkedAtomicQueueProducerNodeRef extends BaseLinkedAtomicQueuePad0 { + private static final AtomicReferenceFieldUpdater P_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(BaseLinkedAtomicQueueProducerNodeRef.class, LinkedQueueAtomicNode.class, "producerNode"); + + protected volatile LinkedQueueAtomicNode producerNode; + + protected final void spProducerNode(LinkedQueueAtomicNode node) { + P_NODE_UPDATER.lazySet(this, node); + } + + protected final LinkedQueueAtomicNode lvProducerNode() { + return producerNode; + } + + protected final LinkedQueueAtomicNode lpProducerNode() { + return lvProducerNode(); + } + + protected final LinkedQueueAtomicNode xchgProducerNode(LinkedQueueAtomicNode node) { + return P_NODE_UPDATER.getAndSet(this, node); + } +} + +abstract class BaseLinkedAtomicQueuePad1 extends BaseLinkedAtomicQueueProducerNodeRef { + long p01, p02, p03, p04, p05, p06, p07; + long p10, p11, p12, p13, p14, p15, p16, p17; +} + +abstract class BaseLinkedAtomicQueueConsumerNodeRef extends BaseLinkedAtomicQueuePad1 { + private static final AtomicReferenceFieldUpdater C_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(BaseLinkedAtomicQueueConsumerNodeRef.class, LinkedQueueAtomicNode.class, "consumerNode"); + + protected volatile LinkedQueueAtomicNode consumerNode; - private volatile LinkedQueueAtomicNode producerNode; - private volatile LinkedQueueAtomicNode consumerNode; + protected final void spConsumerNode(LinkedQueueAtomicNode node) { + C_NODE_UPDATER.lazySet(this, node); + } + + protected final LinkedQueueAtomicNode lvConsumerNode() { + return consumerNode; + } + protected final LinkedQueueAtomicNode lpConsumerNode() { + return lvConsumerNode(); + } +} + +abstract class BaseLinkedAtomicQueuePad2 extends BaseLinkedAtomicQueueConsumerNodeRef { + long p01, p02, p03, p04, p05, p06, p07; + long p10, p11, p12, p13, p14, p15, p16, p17; +} + +abstract class BaseLinkedAtomicQueue extends BaseLinkedAtomicQueuePad2 { + @Override public final Iterator iterator() { throw new UnsupportedOperationException(); @@ -99,32 +149,4 @@ protected E relaxedPeek() { } return null; } - - protected final LinkedQueueAtomicNode lvProducerNode() { - return producerNode; - } - - protected final LinkedQueueAtomicNode lpProducerNode() { - return lvProducerNode(); - } - - protected final void spProducerNode(LinkedQueueAtomicNode node) { - P_NODE_UPDATER.lazySet(this, node); - } - - protected final LinkedQueueAtomicNode xchgProducerNode(LinkedQueueAtomicNode node) { - return P_NODE_UPDATER.getAndSet(this, node); - } - - protected final LinkedQueueAtomicNode lvConsumerNode() { - return consumerNode; - } - - protected final LinkedQueueAtomicNode lpConsumerNode() { - return lvConsumerNode(); - } - - protected final void spConsumerNode(LinkedQueueAtomicNode node) { - C_NODE_UPDATER.lazySet(this, node); - } }