DedicatedModeReplayer( final ErrorHandler errorHandler, final AtomicCounter errorCounter, final ManyToOneConcurrentArrayQueue<Session> closeQueue, final int maxConcurrentSessions) { super("archive-replayer", errorHandler); this.closeQueue = closeQueue; this.errorCounter = errorCounter; this.sessionsQueue = new OneToOneConcurrentArrayQueue<>(maxConcurrentSessions); }
private void send(final ReplaySession session) { while (!sessionsQueue.offer(session)) { errorCounter.increment(); Thread.yield(); } } }
protected int preWork() { return sessionsQueue.drain(this); }
@Override public void subscribeAll(Consumer<? super R> onNext, Consumer<? super Throwable> onError, Runnable onCompleteDs) { OneToOneConcurrentArrayQueue<T1> leftQ = new OneToOneConcurrentArrayQueue<T1>(1024); OneToOneConcurrentArrayQueue<T2> rightQ = new OneToOneConcurrentArrayQueue<T2>(1024); return; try { if (!leftQ.isEmpty()) { R value =fn.apply(leftQ.poll(), (T2) e); if(status.compareAndSet(0,2) && leftQ.isEmpty()) { rightQ.offer((T2) e); while (leftQ.isEmpty()) { // VALUE IS COMING if(leftComplete.get() && leftQ.isEmpty()){ handleComplete(completing,onCompleteDs); return; R value = fn.apply(leftQ.poll(), (T2) e); if( (leftComplete.get() && leftQ.isEmpty()) || (rightComplete.get() && rightQ.isEmpty())){ rightSub[0].cancel(); handleComplete(completing,onCompleteDs); if (!rightQ.isEmpty() ) { R value = fn.apply((T1) e, rightQ.poll()); if(status.compareAndSet(0,1) && rightQ.isEmpty()) {
public boolean offer(final E e) { if (null == e) { throw new NullPointerException("Null is not a valid element"); } final int capacity = this.capacity; long currentHead = headCache; long bufferLimit = currentHead + capacity; final long currentTail = tail; if (currentTail >= bufferLimit) { currentHead = head; bufferLimit = currentHead + capacity; if (currentTail >= bufferLimit) { return false; } headCache = currentHead; } final long elementOffset = sequenceToBufferOffset(currentTail, capacity - 1); UNSAFE.putOrderedObject(buffer, elementOffset, e); UNSAFE.putOrderedLong(this, TAIL_OFFSET, currentTail + 1); return true; }
@Override protected DirectBuffer allocate() { final OneToOneConcurrentArrayQueue<DirectBuffer> q = BUFFERS.get(); final DirectBuffer buffer = q.poll(); if (buffer != null && buffer.capacity() >= 0) { return buffer; } else { final ByteBuffer bb = allocateDirect(0); return new UnsafeBuffer(bb); } }
OneToOneConcurrentArrayQueue<T1> leftQ = new OneToOneConcurrentArrayQueue<T1>(1024); OneToOneConcurrentArrayQueue<T2> rightQ = new OneToOneConcurrentArrayQueue<T2>(1024); StreamSubscription leftSub[] = {null}; StreamSubscription rightSub[] = {null}; if (!rightQ.isEmpty() ) { R value = fn.apply((T1) e, rightQ.poll()); sub.requested.decrementAndGet(); onNext.accept(value); if(status.compareAndSet(0,1) && rightQ.isEmpty()) { leftQ.offer((T1) e); while(rightQ.isEmpty()){ // VALUE IS COMING - RIGHT IS ADDING TO Q if(rightComplete.get() && rightQ.isEmpty()){ handleComplete(completing,onComplete); return; R value = fn.apply((T1) e, rightQ.poll()); sub.requested.decrementAndGet(); onNext.accept(value); if( (rightComplete.get() && rightQ.isEmpty()) || (leftComplete.get() && leftQ.isEmpty())){ leftSub[0].cancel(); handleComplete(completing,onComplete); return; try {
@SuppressWarnings("unchecked") public int drainTo(final Collection<? super E> target, final int limit) { final Object[] buffer = this.buffer; final long mask = this.capacity - 1; long nextSequence = head; int count = 0; while (count < limit) { final long elementOffset = sequenceToBufferOffset(nextSequence, mask); final Object item = UNSAFE.getObjectVolatile(buffer, elementOffset); if (null == item) { break; } UNSAFE.putOrderedObject(buffer, elementOffset, null); nextSequence++; UNSAFE.putOrderedLong(this, HEAD_OFFSET, nextSequence); count++; target.add((E)item); } return count; } }
@Override protected DirectBuffer allocate() { final OneToOneConcurrentArrayQueue<DirectBuffer> q = BUFFERS.get(); final DirectBuffer buffer = q.poll(); if (buffer != null && buffer.capacity() >= 0) { return buffer; } else { final ByteBuffer bb = allocateDirect(0); return new UnsafeBuffer(bb); } }
@Override public void subscribeAll(Consumer<? super R> onNext, Consumer<? super Throwable> onError, Runnable onCompleteDs) { OneToOneConcurrentArrayQueue<T1> leftQ = new OneToOneConcurrentArrayQueue<T1>(1024); OneToOneConcurrentArrayQueue<T2> rightQ = new OneToOneConcurrentArrayQueue<T2>(1024); return; try { if (!leftQ.isEmpty()) { R value =fn.apply(leftQ.poll(), (T2) e); if(status.compareAndSet(0,2) && leftQ.isEmpty()) { rightQ.offer((T2) e); while (leftQ.isEmpty()) { // VALUE IS COMING if(leftComplete.get() && leftQ.isEmpty()){ handleComplete(completing,onCompleteDs); return; R value = fn.apply(leftQ.poll(), (T2) e); if( (leftComplete.get() && leftQ.isEmpty()) || (rightComplete.get() && rightQ.isEmpty())){ rightSub[0].cancel(); handleComplete(completing,onCompleteDs); if (!rightQ.isEmpty() ) { R value = fn.apply((T1) e, rightQ.poll()); if(status.compareAndSet(0,1) && rightQ.isEmpty()) {
DedicatedModeRecorder( final ErrorHandler errorHandler, final AtomicCounter errorCounter, final ManyToOneConcurrentArrayQueue<Session> closeQueue, final int maxConcurrentSessions) { super("archive-recorder", errorHandler); this.closeQueue = closeQueue; this.errorCounter = errorCounter; this.sessionsQueue = new OneToOneConcurrentArrayQueue<>(maxConcurrentSessions); }
protected void preSessionsClose() { sessionsQueue.drain(this); }
private void send(final RecordingSession session) { while (!sessionsQueue.offer(session)) { errorCounter.increment(); Thread.yield(); } } }
@SuppressWarnings("unchecked") public E poll() { final Object[] buffer = this.buffer; final long currentHead = head; final long elementOffset = sequenceToBufferOffset(currentHead, capacity - 1); final Object e = UNSAFE.getObjectVolatile(buffer, elementOffset); if (null != e) { UNSAFE.putOrderedObject(buffer, elementOffset, null); UNSAFE.putOrderedLong(this, HEAD_OFFSET, currentHead + 1); } return (E)e; }
@Override public void subscribeAll(Consumer<? super R> onNext, Consumer<? super Throwable> onError, Runnable onCompleteDs) { OneToOneConcurrentArrayQueue<T1> leftQ = new OneToOneConcurrentArrayQueue<T1>(1024); OneToOneConcurrentArrayQueue<T2> rightQ = new OneToOneConcurrentArrayQueue<T2>(1024); return; try { if (!leftQ.isEmpty()) { R value =fn.apply(leftQ.poll(), (T2) e); if(status.compareAndSet(0,2) && leftQ.isEmpty()) { rightQ.offer((T2) e); while (leftQ.isEmpty()) { // VALUE IS COMING if(leftComplete.get() && leftQ.isEmpty()){ handleComplete(completing,onCompleteDs); return; R value = fn.apply(leftQ.poll(), (T2) e); if( (leftComplete.get() && leftQ.isEmpty()) || (rightComplete.get() && rightQ.isEmpty())){ rightSub[0].cancel(); handleComplete(completing,onCompleteDs); if (!rightQ.isEmpty() ) { R value = fn.apply((T1) e, rightQ.poll()); if(status.compareAndSet(0,1) && rightQ.isEmpty()) {
receiverCommandQueue = new OneToOneConcurrentArrayQueue<>(CMD_QUEUE_CAPACITY); senderCommandQueue = new OneToOneConcurrentArrayQueue<>(CMD_QUEUE_CAPACITY);
protected int preWork() { return sessionsQueue.drain(this); }