Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ FindNewWork()

unsafe bool System.Threading.Tasks.RangeWorker.FindNewWork ( out long nFromInclusiveLocal,
out long nToExclusiveLocal )
inlinepackage

Definition at line 33 of file RangeWorker.cs.

34 {
35 int num = _indexRanges.Length;
36 do
37 {
38 IndexRange indexRange = _indexRanges[_nCurrentIndexRange];
39 if (indexRange._bRangeFinished == 0)
40 {
42 if (nSharedCurrentIndexOffset == null)
43 {
44 Interlocked.CompareExchange(ref _indexRanges[_nCurrentIndexRange]._nSharedCurrentIndexOffset, new StrongBox<long>(0L), null);
46 }
47 long num2;
48 if (IntPtr.Size == 4 && _use32BitCurrentIndex)
49 {
50 fixed (long* ptr = &nSharedCurrentIndexOffset.Value)
51 {
52 num2 = Interlocked.Add(ref *(int*)ptr, (int)_nIncrementValue) - _nIncrementValue;
53 }
54 }
55 else
56 {
57 num2 = Interlocked.Add(ref nSharedCurrentIndexOffset.Value, _nIncrementValue) - _nIncrementValue;
58 }
59 if (indexRange._nToExclusive - indexRange._nFromInclusive > num2)
60 {
61 nFromInclusiveLocal = indexRange._nFromInclusive + num2;
62 nToExclusiveLocal = nFromInclusiveLocal + _nIncrementValue;
63 if (nToExclusiveLocal > indexRange._nToExclusive || nToExclusiveLocal < indexRange._nFromInclusive)
64 {
65 nToExclusiveLocal = indexRange._nToExclusive;
66 }
68 {
71 {
73 }
74 }
75 return true;
76 }
77 Interlocked.Exchange(ref _indexRanges[_nCurrentIndexRange]._bRangeFinished, 1);
78 }
80 num--;
81 }
82 while (num > 0);
83 nFromInclusiveLocal = 0L;
84 nToExclusiveLocal = 0L;
85 return false;
86 }
volatile StrongBox< long > _nSharedCurrentIndexOffset
Definition IndexRange.cs:13
readonly IndexRange[] _indexRanges
Definition RangeWorker.cs:9

References System.Threading.Tasks.IndexRange._bRangeFinished, System.Threading.Tasks.RangeWorker._indexRanges, System.Threading.Tasks.RangeWorker._nCurrentIndexRange, System.Threading.Tasks.IndexRange._nFromInclusive, System.Threading.Tasks.RangeWorker._nIncrementValue, System.Threading.Tasks.RangeWorker._nMaxIncrementValue, System.Threading.Tasks.IndexRange._nSharedCurrentIndexOffset, System.Threading.Tasks.IndexRange._nToExclusive, System.Threading.Tasks.RangeWorker._use32BitCurrentIndex, System.Threading.Interlocked.Add(), System.Threading.Interlocked.CompareExchange(), System.Threading.Interlocked.Exchange(), System.L, System.IntPtr.Size, and System.Runtime.CompilerServices.StrongBox< T >.Value.

Referenced by System.Threading.Tasks.RangeWorker.FindNewWork32().