public void OnSubscribe(ISubscription subscription)
                {
                    if (SubscriptionHelper.SetOnce(ref upstream, subscription))
                    {
                        if (subscription is IQueueSubscription <R> qs)
                        {
                            int m = qs.RequestFusion(FusionSupport.ANY | FusionSupport.BARRIER);
                            if (m == FusionSupport.SYNC)
                            {
                                fusionMode = m;
                                Volatile.Write(ref queue, qs);
                                Volatile.Write(ref done, true);
                                parent.Drain();
                                return;
                            }
                            if (m == FusionSupport.ASYNC)
                            {
                                fusionMode = m;
                                Volatile.Write(ref queue, qs);
                                subscription.Request(prefetch);
                                return;
                            }
                        }

                        int pf = prefetch;
                        if (pf == int.MaxValue)
                        {
                            subscription.Request(long.MaxValue);
                        }
                        else
                        {
                            subscription.Request(pf);
                        }
                    }
                }
 public void OnSubscribe(ISubscription subscription)
 {
     if (SubscriptionHelper.SetOnce(ref upstream, subscription))
     {
         subscription.Request(long.MaxValue);
     }
 }
Example #3
0
                public void OnSubscribe(ISubscription subscription)
                {
                    if (SubscriptionHelper.SetOnce(ref upstream, subscription))
                    {
                        if (subscription is IQueueSubscription <R> qs)
                        {
                            int mode = qs.RequestFusion(FusionSupport.ANY | FusionSupport.BARRIER);
                            if (mode == FusionSupport.SYNC)
                            {
                                fusionMode = mode;
                                Volatile.Write(ref queue, qs);
                                Volatile.Write(ref done, true);
                                parent.Drain();
                                return;
                            }
                            if (mode == FusionSupport.ASYNC)
                            {
                                fusionMode = mode;
                                Volatile.Write(ref queue, qs);
                                subscription.Request(bufferSize);

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

                            if (m == FusionSupport.ASYNC)
                            {
                                fusionMode = m;
                                Volatile.Write(ref queue, qs);

                                subscription.Request(prefetch);
                                return;
                            }
                        }

                        Volatile.Write(ref queue, new SpscArrayQueue <T>(prefetch));

                        subscription.Request(prefetch);
                    }
                }
Example #5
0
 public void OnSubscribe(ISubscription subscription)
 {
     if (SubscriptionHelper.SetOnce(ref upstream, subscription))
     {
         subscription.Request(parent.bufferSize);
     }
 }
Example #6
0
 public void OnSubscribe(ISubscription subscription)
 {
     if (SubscriptionHelper.SetOnce(ref upstream, subscription))
     {
         upstream.Request(prefetch);
     }
 }
 public void OnSubscribe(ISubscription subscription)
 {
     if (SubscriptionHelper.SetOnce(ref upstream, subscription))
     {
         actual.OnSubscribe(this);
     }
 }
Example #8
0
            public void OnSubscribe(ISubscription subscription)
            {
                if (SubscriptionHelper.SetOnce(ref upstream, subscription))
                {
                    actual.OnSubscribe(this);

                    subscription.Request(maxConcurrency);
                }
            }
Example #9
0
 public void OnSubscribe(ISubscription subscription)
 {
     if (requestOn)
     {
         if (SubscriptionHelper.SetOnce(ref upstream, subscription))
         {
             long r = Interlocked.Exchange(ref requested, 0L);
             if (r != 0L)
             {
                 worker.Schedule(() => upstream.Request(r));
             }
         }
     }
     else
     {
         SubscriptionHelper.DeferredSetOnce(ref upstream, ref requested, subscription);
     }
 }