public void request()

in servicetalk-concurrent-api/src/main/java/io/servicetalk/concurrent/api/SingleConcatWithPublisher.java [257:313]


        public void request(long n) {
            for (;;) {
                final Object oldVal = mayBeResult;
                if (oldVal == CANCELLED) {
                    break;
                } else if (oldVal == PUBLISHER_SUBSCRIBED || oldVal == REQUESTED_MORE) {
                    super.request(n);
                    break;
                } else if (!isRequestNValid(n)) {
                    mayBeResult = CANCELLED;
                    try {
                        target.onError(newExceptionForInvalidRequestN(n));
                    } finally {
                        superCancel();
                    }
                    break;
                } else if (oldVal == INITIAL) {
                    if (n > 1) {
                        if (mayBeResultUpdater.compareAndSet(this, oldVal, REQUESTED_MORE)) {
                            super.request(n - 1);
                            break;
                        }
                    } else {
                        assert n == 1;
                        if (mayBeResultUpdater.compareAndSet(this, oldVal, REQUESTED_ONE)) {
                            break;
                        }
                    }
                } else if (oldVal == REQUESTED_ONE || oldVal == SINGLE_DELIVERING) {
                    if (mayBeResultUpdater.compareAndSet(this, oldVal, REQUESTED_MORE)) {
                        super.request(n);
                        break;
                    }
                } else if (oldVal == SINGLE_DELIVERED) {
                    if (mayBeResultUpdater.compareAndSet(this, oldVal, PUBLISHER_SUBSCRIBED)) {
                        super.request(n);
                        next.subscribeInternal(this);
                        break;
                    }
                } else if (n > 1) {
                    if (mayBeResultUpdater.compareAndSet(this, oldVal, PUBLISHER_SUBSCRIBED)) {
                        @SuppressWarnings("unchecked")
                        final T tVal = (T) oldVal;
                        if (tryEmitSingleSuccessToTarget(tVal)) {
                            super.request(n - 1);
                            next.subscribeInternal(this);
                        }
                        break;
                    }
                } else if (mayBeResultUpdater.compareAndSet(this, oldVal, SINGLE_DELIVERING)) {
                    @SuppressWarnings("unchecked")
                    final T tVal = (T) oldVal;
                    emitSingleSuccessToTarget(tVal);
                    break;
                }
            }
        }