void Terminate(IDisposable connection) { lock (this) { if (this.connection == connection) { this.connection = new SequentialDisposable(); state = 0; this.connected = false; source.Reset(); } } }
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)); } }
internal IDisposable Schedule(Action action, TimeSpan initialDelay, TimeSpan period) { if (Volatile.Read(ref shutdown)) { return(EmptyDisposable.Instance); } SequentialDisposable inner = new SequentialDisposable(); SequentialDisposable outer = new SequentialDisposable(inner); long due = SchedulerHelper.NowUTC() + (long)initialDelay.TotalMilliseconds; long id = Interlocked.Increment(ref index); long[] count = { 0 }; Action recursive = null; recursive = () => { action(); var duePeriod = due + (long)(++count[0] * period.TotalMilliseconds); var idPeriod = Interlocked.Increment(ref index); var periodTT = new TimedTask(recursive, duePeriod, idPeriod, queue); if (Offer(periodTT)) { outer.Replace(periodTT); } }; var tt = new TimedTask(recursive, due, id, queue); if (Offer(tt)) { inner.Replace(tt); return(outer); } return(EmptyDisposable.Instance); }
void Remove(IDisposable connection) { lock (this) { if (this.connection == connection) { if (--state == 0) { this.connection = new SequentialDisposable(); this.connected = false; connection.Dispose(); source.Reset(); } else { return; } } else { return; } } }
internal FlowableRefCount(IConnectableFlowable <T> source, int count) { this.source = source; this.count = count; this.connection = new SequentialDisposable(); }