Beispiel #1
0
            public void OnSubscribe(ISubscription subscription)
            {
                if (SubscriptionHelper.Validate(ref upstream, subscription))
                {
                    actual.OnSubscribe(this);

                    var b = bufferSize - 1;
                    if (b != 0)
                    {
                        subscription.Request(b);
                    }
                }
            }
Beispiel #2
0
            public void OnSubscribe(ISubscription subscription)
            {
                if (SubscriptionHelper.Validate(ref upstream, subscription))
                {
                    SequentialDisposable sd = new SequentialDisposable();
                    timer = sd;

                    ArbiterSet(subscription);

                    actual.OnSubscribe(this);

                    sd.Set(worker.Schedule(() => Timeout(0), firstTimeout));
                }
            }
 public void Request(long n)
 {
     if (SubscriptionHelper.Validate(n))
     {
         SubscriptionHelper.AddRequest(ref requested, n);
         if (outputFused)
         {
             DrainFused();
         }
         else
         {
             Drain();
         }
     }
 }
 public void Request(long n)
 {
     if (SubscriptionHelper.Validate(n))
     {
         long u = SubscriptionHelper.MultiplyCap(n, skip);
         if (Volatile.Read(ref firstRequest) == 0 && Interlocked.CompareExchange(ref firstRequest, 1, 0) == 0)
         {
             if (u != long.MaxValue)
             {
                 u -= (skip - size);
             }
         }
         upstream.Request(u);
     }
 }
 public void Request(long n)
 {
     if (SubscriptionHelper.Validate(n))
     {
         SubscriptionHelper.AddRequest(ref requested, n);
         long u = SubscriptionHelper.MultiplyCap(n, size - skip);
         if (Volatile.Read(ref firstRequest) == 0 && Interlocked.CompareExchange(ref firstRequest, 1, 0) == 0)
         {
             u += skip;
             if (u < 0L)
             {
                 u = long.MaxValue;
             }
         }
         upstream.Request(u);
     }
 }
 public void Request(long n)
 {
     if (SubscriptionHelper.Validate(n))
     {
         int w = Volatile.Read(ref winner);
         if (w == -1)
         {
             foreach (var s in subscribers)
             {
                 s.Request(n);
             }
         }
         else
         {
             subscribers[w].Request(n);
         }
     }
 }
 public override void Request(long n)
 {
     if (SubscriptionHelper.Validate(n))
     {
         if (Volatile.Read(ref once) == 0 && Interlocked.CompareExchange(ref once, 1, 0) == 0)
         {
             if (n >= limit)
             {
                 upstream.Request(limitRequest ? limit : long.MaxValue);
             }
             else
             {
                 upstream.Request(n);
             }
         }
         else
         {
             upstream.Request(n);
         }
     }
 }
            public void OnSubscribe(ISubscription subscription)
            {
                if (SubscriptionHelper.Validate(ref upstream, subscription))
                {
                    if (subscription is IQueueSubscription <T> qs)
                    {
                        int m = qs.RequestFusion(FusionSupport.ANY | FusionSupport.BARRIER);
                        if (m == FusionSupport.SYNC)
                        {
                            fusionMode = m;
                            queue      = qs;
                            Volatile.Write(ref done, true);

                            InitRails();
                            Drain();
                            return;
                        }

                        if (m == FusionSupport.ASYNC)
                        {
                            fusionMode = m;
                            queue      = qs;

                            InitRails();

                            subscription.Request(bufferSize);
                            return;
                        }
                    }

                    queue = new SpscArrayQueue <T>(bufferSize);

                    InitRails();

                    subscription.Request(bufferSize);
                }
            }
            public void OnSubscribe(ISubscription subscription)
            {
                if (SubscriptionHelper.Validate(ref upstream, subscription))
                {
                    if (subscription is IQueueSubscription<T> qs)
                    {
                        int m = qs.RequestFusion(FusionSupport.ANY);
                        if (m == FusionSupport.SYNC)
                        {
                            fusionMode = m;
                            queue = qs;
                            Volatile.Write(ref done, true);

                            actual.OnSubscribe(this);

                            Drain();
                            return;
                        }
                        if (m == FusionSupport.ASYNC)
                        {
                            fusionMode = m;
                            queue = qs;

                            actual.OnSubscribe(this);

                            qs.Request(prefetch);
                            return;
                        }
                    }

                    queue = new SpscArrayQueue<T>(prefetch);

                    actual.OnSubscribe(this);

                    upstream.Request(prefetch);
                }
            }
Beispiel #10
0
 public void Request(long n)
 {
     SubscriptionHelper.Validate(n);
 }