示例#1
0
文件: Time.cs 项目: tinudu/Linx
                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 + "???");
                    }
                }
示例#2
0
文件: sun.misc.cs 项目: moayyaed/ikvm
    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
    }
示例#3
0
 /// <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));
 }
示例#4
0
 /// <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));
 }