コード例 #1
0
        public void TestLongIteration()
        {
            LinearSpinWait sw = new LinearSpinWait();

            for (int i = 0; i < 2000; i++)
            {
                sw.SpinOnce();
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        public void YieldThresholdCalculateCorrectly()
        {
            int val = LinearSpinWait.CalculateYieldThreshold(LinearSpinWait.DefaultSingleSpinCount);

            Assert.AreEqual(LinearSpinWait.DefaultYieldThreshold, val);
        }