private void Finish(object state) { GC.KeepAlive(state); ThreadingHelper.SpinWaitWhile(ref _status, _changing); if (Interlocked.CompareExchange(ref _status, _executing, _created) == _created) { var callback = Volatile.Read(ref Callback); if (callback != null) { callback.Invoke(); Close(); Volatile.Write(ref _status, _executed); } } }
private static void Initialize() { var check = Interlocked.CompareExchange(ref _status, _statusPending, _statusNotReady); switch (check) { case _statusNotReady: GC.KeepAlive(new GCProbe()); Volatile.Write(ref _status, _statusReady); break; case _statusPending: ThreadingHelper.SpinWaitUntil(ref _status, _statusReady); break; } }
public TReturn DisposedConditional <TReturn>(Func <TReturn> whenDisposed, Func <TReturn> whenNotDisposed) { if (_status == -1) { if (ReferenceEquals(whenDisposed, null)) { return(default(TReturn)); } else { return(whenDisposed.Invoke()); } } else { if (ReferenceEquals(whenNotDisposed, null)) { return(default(TReturn)); } else { if (ThreadingHelper.SpinWaitRelativeSet(ref _status, 1, -1)) { try { return(whenNotDisposed.Invoke()); } finally { global::System.Threading.Interlocked.Decrement(ref _status); } } else { if (ReferenceEquals(whenDisposed, null)) { return(default(TReturn)); } else { return(whenDisposed.Invoke()); } } } } }
public bool Change(long dueTime) { if (Interlocked.CompareExchange(ref _status, _changing, _created) == _created) { _startTime = ThreadingHelper.Milliseconds(ThreadingHelper.TicksNow()); _targetTime = _startTime + dueTime; var wrapped = Interlocked.CompareExchange(ref _wrapped, null, null); if (wrapped == null) { return(false); } wrapped.Change(TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(-1)); Volatile.Write(ref _status, _created); return(true); } return(false); }
private bool TakeDisposalExecution() { return(_status != -1 && ThreadingHelper.SpinWaitSetUnless(ref _status, -1, 0, -1)); }
protected void Start(long dueTime) { _startTime = ThreadingHelper.Milliseconds(ThreadingHelper.TicksNow()); _targetTime = _startTime + dueTime; _wrapped = new Timer(Finish, null, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(-1)); }