public void OnSubscribe(ISubscription subscription) { if (SubscriptionHelper.Validate(ref upstream, subscription)) { actual.OnSubscribe(this); var b = bufferSize - 1; if (b != 0) { subscription.Request(b); } } }
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); } }
public void Request(long n) { SubscriptionHelper.Validate(n); }