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; } } }
internal void Remove(PublisherPublishInner inner) { ProcessorHelper.Remove(ref subscribers, inner, Terminated, Empty); }
internal bool Add(PublisherPublishInner inner) { return(ProcessorHelper.Add(ref subscribers, inner, Terminated)); }