コード例 #1
0
        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;
            }
        }
コード例 #2
0
 public PublisherRefCountInner(ISubscriber <T> actual, PublisherRefCountConnection connection)
 {
     this.actual     = actual;
     this.connection = connection;
 }