internal TakeConditionalSubscriber(IConditionalSubscriber <T> actual, long n, bool limitRequest)
 {
     this.actual       = actual;
     this.remaining    = n;
     this.limit        = n;
     this.limitRequest = limitRequest;
 }
 internal BaseOnErrorResumeWithConditionalSubscriber(IConditionalSubscriber <T> actual,
                                                     Func <Exception, bool> predicate, Func <Exception, IPublisher <T> > publisherFactory)
 {
     this.actual           = actual;
     this.predicate        = predicate;
     this.publisherFactory = publisherFactory;
 }
 internal TimeoutConditionalSubscriber(IConditionalSubscriber <T> actual, IPublisher <U> firstTimeout, Func <T, IPublisher <V> > itemTimeout, IPublisher <T> fallback)
 {
     this.actual       = actual;
     this.firstTimeout = firstTimeout;
     this.itemTimeout  = itemTimeout;
     this.fallback     = fallback;
 }
Esempio n. 4
0
 public void Subscribe(ISubscriber <V> s)
 {
     if (Interlocked.CompareExchange(ref once, 1, 0) == 0)
     {
         s.OnSubscribe(this);
         if (s is IConditionalSubscriber <V> )
         {
             Volatile.Write(ref conditional, (IConditionalSubscriber <V>)s);
             if (Volatile.Read(ref cancelled) != 0)
             {
                 conditional = null;
                 return;
             }
         }
         else
         {
             Volatile.Write(ref regular, s);
             if (Volatile.Read(ref cancelled) != 0)
             {
                 regular = null;
                 return;
             }
         }
         Drain();
     }
     else
     {
         EmptySubscription <V> .Error(s, new InvalidOperationException("The IGroupedFlux allows only a single ISubscriber!"));
     }
 }
Esempio n. 5
0
 internal PeekConditionalSubscriber(IConditionalSubscriber <T> actual, ParallelFlowablePeek <T> parent)
 {
     this.actual      = actual;
     this.parent      = parent;
     this.onNext      = parent.onNext;
     this.onAfterNext = parent.onAfterNext;
 }
Esempio n. 6
0
 internal UsingConditionalSubscriber(IConditionalSubscriber <T> actual,
                                     D resource, Action <D> resourceCleanup, bool eager)
 {
     this.actual          = actual;
     this.resource        = resource;
     this.resourceCleanup = resourceCleanup;
     this.eager           = eager;
 }
 internal ConcatBaseConditionalSubscriber(IConditionalSubscriber <R> actual, Func <T, IPublisher <R> > mapper, int prefetch)
 {
     this.actual   = actual;
     this.mapper   = mapper;
     this.prefetch = prefetch;
     this.limit    = prefetch - (prefetch >> 2);
     this.inner    = new ConcatInnerSubscriber(this);
 }
            internal AmbConditionalSubscription(IConditionalSubscriber <T> actual, int n)
            {
                var a = new AmbInnerConditionalSubscriber[n];

                for (int i = 0; i < n; i++)
                {
                    a[i] = new AmbInnerConditionalSubscriber(this, actual, i);
                }

                winner      = -1;
                subscribers = a;
            }
Esempio n. 9
0
            public void Request(long n)
            {
                if (n <= 0L)
                {
                    throw new ArgumentOutOfRangeException(nameof(n));
                }
                if (SubscriptionHelper.AddRequest(ref requested, n) == 0)
                {
                    int  idx = index;
                    int  f   = end;
                    long e   = 0;
                    IConditionalSubscriber <int> a = actual;

                    for (;;)
                    {
                        while (idx != f && e != n)
                        {
                            if (Volatile.Read(ref cancelled))
                            {
                                return;
                            }

                            if (a.TryOnNext(idx))
                            {
                                e++;
                            }

                            idx++;
                        }

                        if (idx == f)
                        {
                            if (!Volatile.Read(ref cancelled))
                            {
                                a.OnComplete();
                            }
                            return;
                        }

                        n = Volatile.Read(ref requested);
                        if (e == n)
                        {
                            index = idx;
                            n     = Interlocked.Add(ref requested, -n);
                            if (n == 0L)
                            {
                                break;
                            }
                            e = 0L;
                        }
                    }
                }
            }
Esempio n. 10
0
            internal ZipConditionalSubscription(IConditionalSubscriber <R> actual, int n, Func <T[], R> zipper, int prefetch, bool delayErrors)
            {
                this.actual = actual;
                this.zipper = zipper;

                this.current = new T[n];
                var a = new ZipInnerSubscriber[n];

                for (int i = 0; i < n; i++)
                {
                    a[i] = new ZipInnerSubscriber(this, prefetch);
                }

                this.subscribers = a;
                this.delayErrors = delayErrors;
            }
Esempio n. 11
0
            internal CombineLatestConditionalSubscription(IConditionalSubscriber <R> actual, int prefetch, bool delayError, Func <T[], R> combiner, int n)
            {
                this.actual     = actual;
                this.prefetch   = prefetch;
                this.delayError = delayError;
                this.combiner   = combiner;
                this.latest     = new T[n];
                var a = new CombineLatestSubscriber[n];

                for (int i = 0; i < n; i++)
                {
                    a[i] = new CombineLatestSubscriber(this, i, prefetch);
                }
                this.subscribers = a;
                this.queue       = new SpscLinkedArrayQueue <Entry>(prefetch);
            }
        void DrainConditionalFused(IConditionalSubscriber <T> a)
        {
            var q      = queue;
            int missed = 1;

            for (;;)
            {
                if (lvCancelled())
                {
                    conditional = null;
                    q.Clear();
                    return;
                }

                bool d = lvDone();

                a.TryOnNext(default(T));

                if (d)
                {
                    conditional = null;
                    Exception ex = error;
                    if (ex != null)
                    {
                        a.OnError(ex);
                    }
                    else
                    {
                        a.OnComplete();
                    }

                    return;
                }

                missed = QueueDrainHelper.Leave(ref wip, missed);
                if (missed == 0)
                {
                    break;
                }
            }
        }
 internal static bool TryOnNext <T>(IConditionalSubscriber <T> actual, ref int wip, ref Exception error, T item)
 {
     if (Volatile.Read(ref wip) == 0 && Interlocked.CompareExchange(ref wip, 1, 0) == 0)
     {
         bool b = actual.TryOnNext(item);
         if (Interlocked.CompareExchange(ref wip, 0, 1) != 1)
         {
             var ex = Interlocked.Exchange(ref error, ExceptionHelper.Terminated);
             if (ex == null)
             {
                 actual.OnComplete();
             }
             else
             {
                 actual.OnError(ex);
             }
             return(false);
         }
         return(b);
     }
     return(false);
 }
Esempio n. 14
0
 /// <summary>
 /// Signal an OnNext value conditionally and terminate if
 /// there was a concurrent OnError or OnComplete call.
 /// Should be called from one thread at a time.
 /// </summary>
 /// <typeparam name="T">The value type</typeparam>
 /// <param name="actual">The target ISubscriber</param>
 /// <param name="value">The value to signal</param>
 /// <returns>What the TryOnNext returns or false if terminated</returns>
 internal bool TryOnNext <T>(IConditionalSubscriber <T> actual, T value)
 {
     if (Volatile.Read(ref wip) == 0 && Interlocked.CompareExchange(ref wip, 1, 0) == 0)
     {
         bool b = actual.TryOnNext(value);
         if (Interlocked.CompareExchange(ref wip, 0, 1) != 1)
         {
             var ex = ExceptionHelper.Terminate(ref error);
             if (ex != null)
             {
                 actual.OnError(ex);
             }
             else
             {
                 actual.OnComplete();
             }
             return(false);
         }
         return(b);
     }
     return(false);
 }
Esempio n. 15
0
 internal PeekConditionalSubscriber(
     IConditionalSubscriber <T> actual,
     Action <T> onNext,
     Action <T> onAfterNext,
     Action <Exception> onError,
     Action onComplete,
     Action onTerminate,
     Action onAfterTerminate,
     Action <long> onRequest,
     Action <ISubscription> onSubscribe,
     Action onCancel
     ) : base(actual)
 {
     this.onNext           = onNext;
     this.onAfterNext      = onAfterNext;
     this.onError          = onError;
     this.onComplete       = onComplete;
     this.onTerminate      = onTerminate;
     this.onAfterTerminate = onAfterTerminate;
     this.onRequest        = onRequest;
     this.onSubscribe      = onSubscribe;
     this.onCancel         = onCancel;
 }
        /// <inheritdoc/>
        public void Subscribe(ISubscriber <T> s)
        {
            if (Interlocked.CompareExchange(ref once, 1, 0) == 0)
            {
                s.OnSubscribe(this);

                if (s is IConditionalSubscriber <T> )
                {
                    Volatile.Write(ref conditional, (IConditionalSubscriber <T>)s);
                    if (lvCancelled())
                    {
                        conditional = null;
                    }
                    else
                    {
                        Drain();
                    }
                }
                else
                {
                    Volatile.Write(ref regular, s);
                    if (lvCancelled())
                    {
                        regular = null;
                    }
                    else
                    {
                        Drain();
                    }
                }
            }
            else
            {
                EmptySubscription <T> .Error(s, new InvalidOperationException("Only a one ISubscriber allowed. Use Publish() or Replay() to share an UnicastProcessor."));
            }
        }
Esempio n. 17
0
 public DistinctUntilChangedConditionalSubscriber(IConditionalSubscriber <T> actual, Func <T, K> keySelector, IEqualityComparer <K> comparer) : base(actual)
 {
     this.keySelector = keySelector;
     this.comparer    = comparer;
 }
 internal SubscribeOnConditionalSubscriber(IConditionalSubscriber <T> actual, Worker worker)
 {
     this.actual = actual;
     this.worker = worker;
 }
Esempio n. 19
0
 internal WithLatestFromConditionalSubscriber(IConditionalSubscriber <R> actual, int n, Func <T[], R> combiner)
     : base(n, combiner)
 {
     this.actual = actual;
 }
 internal AmbInnerConditionalSubscriber(AmbConditionalSubscription parent, IConditionalSubscriber <T> actual, int index)
 {
     this.parent = parent;
     this.actual = actual;
     this.index  = index;
 }
 public GenerateConditionalSubscriber(IConditionalSubscriber <T> actual, S state, Func <S, ISignalEmitter <T>, S> generator, Action <S> stateDisposer) :
     base(state, generator, stateDisposer)
 {
     this.actual = actual;
 }
Esempio n. 22
0
 internal DoFinallyConditionalSubscriber(IConditionalSubscriber <T> actual, Action onFinally)
 {
     this.actual    = actual;
     this.onFinally = onFinally;
 }
 internal ConcatImmediateConditionalSubscriber(IConditionalSubscriber <R> actual, Func <T, IPublisher <R> > mapper, int prefetch)
     : base(actual, mapper, prefetch)
 {
 }
 internal RepeatFunctionConditionalSubscription(IConditionalSubscriber <T> actual, Func <T> func) : base(func)
 {
     this.actual = actual;
 }
 internal EnumerableConditionalSubscription(IConditionalSubscriber <T> actual, IEnumerator <T> enumerator) : base(enumerator)
 {
     this.actual = actual;
 }
Esempio n. 26
0
 internal FilterConditionalSubscriber(IConditionalSubscriber <T> actual, Func <T, bool> predicate) : base(actual)
 {
     this.predicate = predicate;
 }
Esempio n. 27
0
 internal SkipWhileConditionalSubscriber(IConditionalSubscriber <T> actual, Func <T, bool> predicate)
 {
     this.actual    = actual;
     this.predicate = predicate;
 }
Esempio n. 28
0
 public MapErrorConditionalSubscriber(IConditionalSubscriber <T> actual, Func <Exception, Exception> errorMapper) : base(actual)
 {
     this.errorMapper = errorMapper;
 }
 internal MapTryConditionalSubscriber(IConditionalSubscriber <R> actual, Func <T, R> mapper, Func <long, Exception, ParallelFailureMode> handler)
 {
     this.actual  = actual;
     this.mapper  = mapper;
     this.handler = handler;
 }
 internal HalfSerializedConditionalSubscriber(IConditionalSubscriber <T> actual)
 {
     this.actual = actual;
 }