public void Request(long n)
 {
     if (SubscriptionHelper.Validate(n))
     {
         SubscriptionHelper.AddRequest(ref requested, n);
         Schedule();
     }
 }
 void Request(long n)
 {
     if (n <= 0L)
     {
         throw new ArgumentOutOfRangeException(nameof(n));
     }
     SubscriptionHelper.AddRequest(ref requested, n);
     Drain();
 }
 public void Request(long n)
 {
     if (n <= 0L)
     {
         throw new ArgumentOutOfRangeException(nameof(n));
     }
     if (Volatile.Read(ref wip) == 0 && Interlocked.CompareExchange(ref wip, 1, 0) == 0)
     {
         ISubscription target = null;
         long          r      = requested;
         if (r != long.MaxValue)
         {
             long u = r + n;
             if (u < 0L)
             {
                 requested = long.MaxValue;
             }
             else
             {
                 requested = u;
             }
             target = current;
         }
         if (Interlocked.Decrement(ref wip) == 0)
         {
             target?.Request(n);
             return;
         }
     }
     else
     {
         SubscriptionHelper.AddRequest(ref missedRequested, n);
         if (Interlocked.Increment(ref wip) != 1)
         {
             return;
         }
     }
     ArbiterDrainLoop();
 }