コード例 #1
0
 /// <inheritdoc/>
 public void Request(long n)
 {
     if (SubscriptionHelper.Validate(n))
     {
         if (Interlocked.CompareExchange(ref state, REQUESTED, READY) == READY)
         {
             actual.OnNext(value);
             if (Volatile.Read(ref state) != CANCELLED)
             {
                 actual.OnComplete();
             }
         }
     }
 }
コード例 #2
0
        /// <inheritdoc/>
        public void Request(long n)
        {
            if (!SubscriptionHelper.Validate(n))
            {
                return;
            }
            for (;;)
            {
                int s = Volatile.Read(ref state);
                if (s == CANCELLED || s == HAS_REQUEST_NO_VALUE || s == HAS_REQUEST_HAS_VALUE)
                {
                    return;
                }
                if (s == NO_REQUEST_HAS_VALUE)
                {
                    if (Interlocked.CompareExchange(ref state, HAS_REQUEST_HAS_VALUE, NO_REQUEST_HAS_VALUE) == NO_REQUEST_HAS_VALUE)
                    {
                        T v = value;

                        if (fusionState == EMPTY)
                        {
                            fusionState = HAS_VALUE;
                        }

                        actual.OnNext(v);

                        if (Volatile.Read(ref state) != CANCELLED)
                        {
                            actual.OnComplete();
                        }

                        return;
                    }
                    return;
                }
                if (Interlocked.CompareExchange(ref state, HAS_REQUEST_NO_VALUE, NO_REQUEST_NO_VALUE) == NO_REQUEST_NO_VALUE)
                {
                    break;
                }
            }
        }