public void Subscribe(ISubscriber <T> s) { PublisherCacheInner inner = new PublisherCacheInner(s, this, capacityHint, head); Add(inner); if (inner.IsCancelled()) { Remove(inner); return; } inner.Drain(); if (Volatile.Read(ref once) == 0 && Interlocked.CompareExchange(ref once, 1, 0) == 0) { source.Subscribe(this); } }
void Remove(PublisherCacheInner inner) { ProcessorHelper.Remove(ref subscribers, inner, Terminated, Empty); }
bool Add(PublisherCacheInner inner) { return(ProcessorHelper.Add(ref subscribers, inner, Terminated)); }