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(); }