public override void OnComplete()
            {
                long p = produced;

                if (p != 0L && Volatile.Read(ref requested) != long.MaxValue)
                {
                    Interlocked.Add(ref requested, p);
                }
                BackpressureHelper.PostComplete <IList <T> >(ref requested, actual, lists, ref cancelled);
            }
Beispiel #2
0
 public void OnComplete()
 {
     if (!hasValue)
     {
         BackpressureHelper.PostComplete(ref requested, actual, this, ref cancelled);
     }
     else
     {
         actual.OnComplete();
     }
 }
        /// <summary>
        /// Prepares the value to be the post-complete value.
        /// </summary>
        /// <param name="value">The value to signal post-complete.</param>
        public void Complete(R value)
        {
            long p = produced;

            if (p != 0L)
            {
                Produced(p);
            }
            last     = value;
            hasValue = true;
            BackpressureHelper.PostComplete(ref requested, actual, this, ref cancelled);
        }
Beispiel #4
0
        public void OnComplete()
        {
            if (done)
            {
                return;
            }

            long p = produced;

            if (p != 0L && Volatile.Read(ref requested) != long.MaxValue)
            {
                Interlocked.Add(ref requested, -p);
            }

            BackpressureHelper.PostComplete(ref requested, buffers, actual, ref cancelled);
        }
 public void OnComplete()
 {
     BackpressureHelper.PostComplete(ref requested, actual, queue, ref cancelled);
 }
        public void OnComplete()
        {
            Trim(scheduler.NowUtc());

            BackpressureHelper.PostComplete(ref requested, q, actual, ref cancelled, v => v.value);
        }
Beispiel #7
0
            void Drain()
            {
                if (!QueueDrainHelper.Enter(ref wip))
                {
                    return;
                }

                int missed = 1;
                var a      = actual;
                var q      = queue;
                var bs     = buffers;

                for (;;)
                {
                    for (;;)
                    {
                        if (Volatile.Read(ref cancelled))
                        {
                            foreach (var close in buffers)
                            {
                                close.Cancel();
                            }
                            buffers.Clear();
                            queue.Clear();
                            return;
                        }

                        if (HandleException(a, q))
                        {
                            return;
                        }

                        BufferWork bw;

                        if (q.Poll(out bw))
                        {
                            switch (bw.type)
                            {
                            case BufferWorkType.COMPLETE:
                            {
                                var c = Interlocked.Exchange(ref this.s, SubscriptionHelper.Cancelled);

                                if (c == null)
                                {
                                    q.Clear();

                                    a.OnSubscribe(EmptySubscription <IList <T> > .Instance);
                                }
                                else
                                {
                                    c.Cancel();

                                    q.Clear();
                                }
                                long p = produced;
                                if (p != 0L)
                                {
                                    BackpressureHelper.Produced(ref requested, produced);
                                }
                                BackpressureHelper.PostComplete(ref requested, actual, this, ref cancelled);
                                return;
                            }

                            case BufferWorkType.OPEN:
                            {
                                var b = bw.buffer;

                                bs.AddLast(b);

                                IPublisher <V> p;

                                try
                                {
                                    p = close(b.u);
                                    if (p == null)
                                    {
                                        throw new NullReferenceException("The close function returned a null IPublisher");
                                    }
                                }
                                catch (Exception exc)
                                {
                                    ExceptionHelper.ThrowIfFatal(exc);
                                    ExceptionHelper.AddError(ref error, exc);
                                    HandleException(a, q);
                                    return;
                                }

                                p.Subscribe(b);
                            }
                            break;

                            case BufferWorkType.CLOSE:
                            {
                                if (bs.Remove(bw.buffer))
                                {
                                    var b = bw.buffer.buffer;
                                    if (b.Count != 0)
                                    {
                                        produced++;
                                        a.OnNext(b);
                                    }
                                    else
                                    {
                                        Request(1);
                                    }
                                }
                            }
                            break;

                            default:
                            {
                                foreach (var buffer in bs)
                                {
                                    buffer.buffer.Add(bw.value);
                                }
                            }
                            break;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }

                    missed = QueueDrainHelper.Leave(ref wip, missed);
                    if (missed == 0)
                    {
                        break;
                    }
                }
            }