public void Subscribe(ISubscriber <T> s) { PublisherRefCountConnection current; for (;;) { current = Volatile.Read(ref connection); if (current == null || current.IsDisposed() || current.Wip() == 0) { var next = new PublisherRefCountConnection(); if (Interlocked.CompareExchange(ref connection, next, current) != current) { continue; } } int i = current.Increment(); if (i == 1 || current.IsDisposed()) { continue; } var inner = new PublisherRefCountInner(s, current); source.Subscribe(inner); if (current.TryConnect()) { source.Connect(d => { current.Set(d); current.Decrement(); }); } break; } }
public PublisherRefCountInner(ISubscriber <T> actual, PublisherRefCountConnection connection) { this.actual = actual; this.connection = connection; }