public void OnCompleted()
 {
     if (Interlocked.CompareExchange(ref wip, 1, 0) == 0)
     {
         if (!terminated)
         {
             terminated = true;
             Volatile.Write(ref done, true);
             downstream.OnCompleted();
             Dispose();
             if (Interlocked.Decrement(ref wip) == 0)
             {
                 return;
             }
         }
     }
     else
     {
         Volatile.Write(ref done, true);
         if (Interlocked.Increment(ref wip) != 1)
         {
             return;
         }
     }
     DrainLoop();
 }
示例#2
0
 public void OnCompleted()
 {
     if (Volatile.Read(ref state) == StateFused)
     {
         Volatile.Write(ref state, StateReady);
         downstream.OnNext(default(T));
         if (!Volatile.Read(ref disposed))
         {
             downstream.OnCompleted();
         }
     }
     else
     {
         var queue = this.queue;
         while (queue.Count != 0)
         {
             if (Volatile.Read(ref disposed))
             {
                 return;
             }
             downstream.OnNext(queue.Dequeue());
         }
         if (Volatile.Read(ref disposed))
         {
             return;
         }
         downstream.OnCompleted();
     }
 }
示例#3
0
 public void OnCompleted()
 {
     if (remaining > 0)
     {
         downstream.OnCompleted();
     }
 }
示例#4
0
 public void OnCompleted()
 {
     if (hasValue)
     {
         downstream.OnCompleted();
     }
     else
     {
         Run(null);
     }
 }
 public void OnCompleted()
 {
     if (won || parent.TryWin(index))
     {
         downstream.OnCompleted();
     }
 }
 public virtual void OnCompleted()
 {
     if (done)
     {
         return;
     }
     downstream.OnCompleted();
 }
            internal void Run()
            {
                if (DisposableHelper.IsDisposed(ref task))
                {
                    return;
                }
                if (fused)
                {
                    var fr = fusedReady;
                    if (fr == end)
                    {
                        downstream.OnCompleted();
                        Dispose();
                    }
                    else
                    {
                        Volatile.Write(ref fusedReady, fr + 1);
                        downstream.OnNext(default(long));

                        if (fr + 1 == end)
                        {
                            downstream.OnCompleted();
                            Dispose();
                        }
                    }
                }
                else
                {
                    var idx = index;
                    if (idx == end)
                    {
                        downstream.OnCompleted();
                        Dispose();
                    }
                    else
                    {
                        index = idx + 1;
                        downstream.OnNext(idx);
                        if (idx + 1 == end)
                        {
                            downstream.OnCompleted();
                            Dispose();
                        }
                    }
                }
            }
示例#8
0
 public void OnCompleted()
 {
     if (upstream != DisposableHelper.DISPOSED)
     {
         DisposableHelper.WeakDispose(ref upstream);
         downstream.OnCompleted();
     }
 }
示例#9
0
 public void OnCompleted()
 {
     while (windows.Count != 0)
     {
         windows.Dequeue().OnCompleted();
     }
     downstream.OnCompleted();
 }
            internal void Next()
            {
                if (Interlocked.Increment(ref wip) == 1)
                {
                    for (; ;)
                    {
                        if (DisposableHelper.IsDisposed(ref upstream))
                        {
                            sources?.Dispose();
                            sources = null;
                        }
                        else
                        {
                            var b   = false;
                            var src = default(IObservableSource <T>);

                            try
                            {
                                b = sources.MoveNext();
                                if (b)
                                {
                                    src = ValidationHelper.RequireNonNullRef(sources.Current, "The enumerator returned a null IObservableSource");
                                }
                            }
                            catch (Exception ex)
                            {
                                DisposableHelper.WeakDispose(ref upstream);
                                downstream.OnError(ex);
                                continue;
                            }

                            if (b)
                            {
                                src.Subscribe(this);
                            }
                            else
                            {
                                DisposableHelper.WeakDispose(ref upstream);
                                var ex = Volatile.Read(ref errors);
                                if (ex != null)
                                {
                                    downstream.OnError(ex);
                                }
                                else
                                {
                                    downstream.OnCompleted();
                                }
                                continue;
                            }
                        }

                        if (Interlocked.Decrement(ref wip) == 0)
                        {
                            break;
                        }
                    }
                }
            }
 public void OnCompleted()
 {
     if (done)
     {
         return;
     }
     done = true;
     downstream.OnCompleted();
 }
            public void OnCompleted()
            {
                var d = Interlocked.Exchange(ref resource, DisposableHelper.DISPOSED);

                if (d != DisposableHelper.DISPOSED)
                {
                    downstream.OnCompleted();
                    d?.Dispose();
                }
            }
 public static void OnCompleted <T>(ISignalObserver <T> observer, ref int wip, ref Exception error)
 {
     if (Interlocked.CompareExchange(ref error, ExceptionHelper.TERMINATED, null) == null)
     {
         if (Interlocked.Increment(ref wip) == 1)
         {
             observer.OnCompleted();
         }
     }
 }
 public void OnCompleted()
 {
     if (other == null)
     {
         downstream.OnCompleted();
     }
     else
     {
         Subscribe(null);
     }
 }
示例#15
0
 internal void Run()
 {
     if (Volatile.Read(ref state) == ModeFresh)
     {
         downstream.OnNext(item);
         if (Volatile.Read(ref state) == 0)
         {
             Volatile.Write(ref state, ModeDone);
             downstream.OnCompleted();
         }
     }
 }
        public void Complete(T result)
        {
            var s = Volatile.Read(ref state);

            if (s == Empty)
            {
                downstream.OnNext(result);
                if (Volatile.Read(ref state) != Disposed)
                {
                    downstream.OnCompleted();
                }
            }
            else
            if (s == FusedEmpty)
            {
                value = result;
                Volatile.Write(ref state, FusedReady);
                downstream.OnNext(default(T));
                downstream.OnCompleted();
            }
        }
示例#17
0
            internal void Run()
            {
                var s = Volatile.Read(ref state);

                if (s == Empty)
                {
                    downstream.OnNext(0L);
                    if (Volatile.Read(ref state) != Disposed)
                    {
                        Volatile.Write(ref state, Disposed);
                        downstream.OnCompleted();
                    }
                }
                else
                if (s == FusedEmpty)
                {
                    Volatile.Write(ref state, FusedReady);
                    downstream.OnNext(default(long));
                    downstream.OnCompleted();
                }
            }
示例#18
0
            public void OnCompleted()
            {
                if (done)
                {
                    return;
                }
                var b = buffer;

                buffer = default;

                if (b != null)
                {
                    downstream.OnNext(b);
                }
                downstream.OnCompleted();
            }
 internal void Handle(Task t)
 {
     if (t.IsCanceled)
     {
         observer?.OnError(new OperationCanceledException());
     }
     else
     if (t.IsFaulted)
     {
         observer?.OnError(t.Exception);
     }
     else
     {
         observer?.OnCompleted();
     }
 }
            internal void Run()
            {
                if (fused)
                {
                    return;
                }

                for (; ;)
                {
                    if (Volatile.Read(ref disposed))
                    {
                        enumerator?.Dispose();
                        enumerator = null;
                        break;
                    }
                    else
                    {
                        var v   = default(T);
                        var has = false;

                        try
                        {
                            has = enumerator.MoveNext();
                            if (has)
                            {
                                v = enumerator.Current;
                            }
                        }
                        catch (Exception ex)
                        {
                            downstream.OnError(ex);
                            break;
                        }

                        if (has)
                        {
                            downstream.OnNext(v);
                        }
                        else
                        {
                            downstream.OnCompleted();
                            Volatile.Write(ref disposed, true);
                        }
                    }
                }
            }
示例#21
0
            internal void Next()
            {
                if (Interlocked.Increment(ref wip) == 1)
                {
                    for (; ;)
                    {
                        var idx = index;

                        if (idx == sources.Length)
                        {
                            var ex = Volatile.Read(ref errors);
                            if (ex != null)
                            {
                                downstream.OnError(ex);
                            }
                            else
                            {
                                downstream.OnCompleted();
                            }
                        }
                        else
                        {
                            var src = sources[idx];

                            if (src == null)
                            {
                                downstream.OnError(new NullReferenceException($"sources[{idx}] is null"));
                            }
                            else
                            {
                                index = idx + 1;

                                src.Subscribe(this);
                            }
                        }


                        if (Interlocked.Decrement(ref wip) == 0)
                        {
                            break;
                        }
                    }
                }
            }
 public static void OnNext <T>(ISignalObserver <T> observer, T item, ref int wip, ref Exception error)
 {
     if (Interlocked.CompareExchange(ref wip, 1, 0) == 0)
     {
         observer.OnNext(item);
         if (Interlocked.Decrement(ref wip) != 0)
         {
             var ex = Volatile.Read(ref error);
             if (ex != ExceptionHelper.TERMINATED)
             {
                 observer.OnError(ex);
             }
             else
             {
                 observer.OnCompleted();
             }
         }
     }
 }
示例#23
0
            public void OnCompleted()
            {
                if (done)
                {
                    return;
                }

                var buffers = this.buffers;

                while (buffers.Count != 0)
                {
                    if (Volatile.Read(ref disposed))
                    {
                        buffers.Clear();
                        return;
                    }
                    downstream.OnNext(buffers.Dequeue());
                }
                downstream.OnCompleted();
            }
示例#24
0
            public void OnCompleted()
            {
                if (done)
                {
                    return;
                }
                try
                {
                    onCompleted?.Invoke();
                }
                catch (Exception ex)
                {
                    OnError(ex);
                    return;
                }

                try
                {
                    onTerminate?.Invoke();
                }
                catch (Exception ex)
                {
                    OnErrorCore(ex, false);
                    return;
                }

                downstream.OnCompleted();

                try
                {
                    onAfterTerminate?.Invoke();
                }
                catch (Exception)
                {
                    // TODO where to put these?
                }

                DoFinally();
            }
示例#25
0
 internal static void EmitAll <T>(this ISignalObserver <T> subject, params T[] items)
 {
     Emit(subject, items);
     subject.OnCompleted();
 }
 public void OnCompleted()
 {
     downstream.OnCompleted();
 }
 public void OnCompleted()
 {
     queue.Clear();
     downstream.OnCompleted();
 }
示例#28
0
 public void OnCompleted()
 {
     downstream.OnCompleted();
     parent.Terminate();
 }
 protected override void Completed()
 {
     observer.OnCompleted();
 }
示例#30
0
 public void OnCompleted()
 {
     window?.OnCompleted();
     window = null;
     downstream.OnCompleted();
 }