コード例 #1
0
        public void Subscribe(ISubscriber <T> s)
        {
            PublisherPublishInner inner = new PublisherPublishInner(s);

            s.OnSubscribe(inner);

            for (;;)
            {
                var current = Volatile.Read(ref main);

                if (current == null || current.IsTerminated())
                {
                    var next = new PublisherPublishMain(this, bufferSize);
                    if (Interlocked.CompareExchange(ref main, next, current) != current)
                    {
                        continue;
                    }
                    current = next;
                }

                if (current.Add(inner))
                {
                    inner.SetParent(current);

                    if (inner.IsCancelled())
                    {
                        current.Remove(inner);
                    }
                    current.Drain();
                    break;
                }
            }
        }
コード例 #2
0
 internal void Remove(PublisherPublishInner inner)
 {
     ProcessorHelper.Remove(ref subscribers, inner, Terminated, Empty);
 }
コード例 #3
0
 internal bool Add(PublisherPublishInner inner)
 {
     return(ProcessorHelper.Add(ref subscribers, inner, Terminated));
 }