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