public void Subscribe(ISubscriber <T> s) { var current = Volatile.Read(ref main); if (current == null) { var next = new PublisherReplayMain(bufferSize); current = Interlocked.CompareExchange(ref main, next, null); if (current == null) { current = next; } } current.Subscribe(s); }
public void Connect(Action <IDisposable> onConnect) { for (;;) { var current = Volatile.Read(ref main); if (current == null || current.IsTerminated()) { var next = new PublisherReplayMain(bufferSize); if (Interlocked.CompareExchange(ref main, next, current) != current) { continue; } current = next; } onConnect(current); if (current.TryConnect()) { source.Subscribe(current); } } }
public PublisherReplayInner(ISubscriber <T> actual, PublisherReplayMain parent) { this.actual = actual; this.parent = parent; }