public void TestLongIteration() { LinearSpinWait sw = new LinearSpinWait(); for (int i = 0; i < 2000; i++) { sw.SpinOnce(); } }
private void AddCore(PoolElementWrapper <T> element) { LinearSpinWait sw = new LinearSpinWait(67, 13); var headIndexOp = _headIndexOp; element.NextIndex = GetHeadIndex(headIndexOp); while (Interlocked.CompareExchange(ref _headIndexOp, Repack(element.ThisIndex, headIndexOp), headIndexOp) != headIndexOp) { sw.SpinOnce(); headIndexOp = _headIndexOp; element.NextIndex = GetHeadIndex(headIndexOp); } }
public void TestYieldThresholdWorkCorrectly() { LinearSpinWait sw = new LinearSpinWait(); if (Environment.ProcessorCount > 1) { for (int i = 0; i < LinearSpinWait.DefaultYieldThreshold; i++) { Assert.IsFalse(sw.NextSpinWillYield); sw.SpinOnce(); } } Assert.IsTrue(sw.NextSpinWillYield); }
private bool TryTakeCore(out PoolElementWrapper <T> element) { LinearSpinWait sw = new LinearSpinWait(87, 11); var headIndexOp = _headIndexOp; while (GetHeadIndex(headIndexOp) >= 0) { var headElem = _dataArray.GetItemSafe(GetHeadIndex(headIndexOp)); if (headElem != null && Interlocked.CompareExchange(ref _headIndexOp, Repack(headElem.NextIndex, headIndexOp), headIndexOp) == headIndexOp) { element = headElem; element.NextIndex = -1; return(true); } sw.SpinOnce(); headIndexOp = _headIndexOp; } element = null; return(false); }