public ValueTask Delay(TimeSpan due) { var state = Atomic.Lock(ref _state); switch (state) { case _sInitial: _tsDelay.Reset(); if (due > TimeSpan.Zero) { _state = _sWaiting; try { _timer.Change(due, Timeout.InfiniteTimeSpan); } catch (Exception ex) { if (Atomic.CompareExchange(ref _state, _sInitial, _sWaiting) == _sWaiting) { _tsDelay.SetException(ex); } } } else { _state = _sInitial; _tsDelay.SetResult(); } return(_tsDelay.Task); case _sFinal: _state = _sFinal; return(_tsDelay.Task); case _sWaiting: _state = _sWaiting; throw new InvalidOperationException(Strings.MethodIsNotReentrant); default: _state = state; throw new Exception(state + "???"); } }
public static bool compareAndSwapObject(object thisUnsafe, object obj, long offset, object expect, object update) { #if FIRST_PASS return(false); #else object[] array = obj as object[]; if (array != null) { Stats.Log("compareAndSwapObject.array"); return(Atomic.CompareExchange(array, (int)offset, update, expect) == expect); } else { if (offset >= cacheCompareExchangeObject.Length || cacheCompareExchangeObject[offset] == null) { InterlockedResize(ref cacheCompareExchangeObject, (int)offset + 1); cacheCompareExchangeObject[offset] = (CompareExchangeObject)CreateCompareExchange(offset); } Stats.Log("compareAndSwapObject.", offset); return(cacheCompareExchangeObject[offset](obj, update, expect) == expect); } #endif }
/// <summary> /// Realizes an atomic compare-exchange operation. /// </summary> /// <param name="target">The target location.</param> /// <param name="compare">The expected comparison value.</param> /// <param name="value">The target value.</param> /// <returns>The old value.</returns> public double CompareExchange(ref double target, double compare, double value) { return(Atomic.CompareExchange(ref target, compare, value)); }
/// <summary> /// Realizes an atomic compare-exchange operation. /// </summary> /// <param name="target">The target location.</param> /// <param name="compare">The expected comparison value.</param> /// <param name="value">The target value.</param> /// <returns>The old value.</returns> public double CompareExchange(VariableView <double> target, double compare, double value) { return(Atomic.CompareExchange(target, compare, value)); }