@Override public OrderedQueueEntry getNextValidEntry() { OrderedQueueEntry next = getNextNode(); while(next != null && next.isDeleted()) { final OrderedQueueEntry newNext = next.getNextNode(); if(newNext != null) { OrderedQueueEntryList._nextUpdater.compareAndSet(this,next, newNext); next = getNextNode(); } else { next = null; } } return next; }
@Override public void entryDeleted(QueueEntry queueEntry) { QueueEntry next = _head.getNextNode(); QueueEntry newNext = _head.getNextValidEntry(); // the head of the queue has not been deleted, hence the deletion must have been mid queue. if (next == newNext) { QueueEntry unscavengedHWM = _unscavengedHWM.get(); while(unscavengedHWM == null || unscavengedHWM.compareTo(queueEntry)<0) { _unscavengedHWM.compareAndSet(unscavengedHWM, queueEntry); unscavengedHWM = _unscavengedHWM.get(); } if (_scavenges.incrementAndGet() > _scavengeCount) { _scavenges.set(0L); scavenge(); } } else { QueueEntry unscavengedHWM = _unscavengedHWM.get(); if(unscavengedHWM != null && (next == null || unscavengedHWM.compareTo(next) < 0)) { _unscavengedHWM.compareAndSet(unscavengedHWM, null); } } }
@Override public QueueEntry add(ServerMessage message, final MessageEnqueueRecord enqueueRecord) { final OrderedQueueEntry node = createQueueEntry(message, enqueueRecord); updateStatsOnEnqueue(node); for (;;) { OrderedQueueEntry tail = _tail; OrderedQueueEntry next = tail.getNextNode(); if (tail == _tail) { if (next == null) { node.setEntryId(tail.getEntryId()+1); if (_nextUpdater.compareAndSet(tail, null, node)) { _tailUpdater.compareAndSet(this, tail, node); return node; } } else { _tailUpdater.compareAndSet(this,tail, next); } } } }