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

◆ GetOrAdd()

ItemType System.Diagnostics.Tracing.ConcurrentSet< KeyType, ItemType >.GetOrAdd ( ItemType newItem)
inline

Definition at line 50 of file ConcurrentSet.cs.

51 {
52 ItemType[] array = items;
53 ItemType val;
54 while (true)
55 {
56 ItemType[] array2;
57 if (array == null)
58 {
59 array2 = new ItemType[1] { newItem };
60 goto IL_0088;
61 }
62 int num = 0;
63 int num2 = array.Length;
64 while (true)
65 {
66 int num3 = (num + num2) / 2;
67 val = array[num3];
68 int num4 = val.Compare(newItem);
69 if (num4 == 0)
70 {
71 break;
72 }
73 if (num4 < 0)
74 {
75 num = num3 + 1;
76 }
77 else
78 {
79 num2 = num3;
80 }
81 if (num != num2)
82 {
83 continue;
84 }
85 goto IL_005a;
86 }
87 break;
88 IL_0088:
89 array2 = Interlocked.CompareExchange(ref items, array2, array);
90 if (array != array2)
91 {
92 array = array2;
93 continue;
94 }
95 val = newItem;
96 break;
97 IL_005a:
98 int num5 = array.Length;
99 array2 = new ItemType[num5 + 1];
100 Array.Copy(array, array2, num);
101 array2[num] = newItem;
102 Array.Copy(array, num, array2, num + 1, num5 - num);
103 goto IL_0088;
104 }
105 return val;
106 }
static int CompareExchange(ref int location1, int value, int comparand)

References System.array, System.Threading.Interlocked.CompareExchange(), System.Array.Copy(), and System.Diagnostics.Tracing.ConcurrentSet< KeyType, ItemType >.items.