Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
CorrelationManager.cs
Go to the documentation of this file.
4
5namespace System.Diagnostics;
6
8{
9 private sealed class StackNode
10 {
11 internal int Count { get; }
12
13 internal object Value { get; }
14
15 internal StackNode Prev { get; }
16
17 internal StackNode(object value, StackNode prev = null)
18 {
19 Value = value;
20 Prev = prev;
21 Count = ((prev == null) ? 1 : (prev.Count + 1));
22 }
23 }
24
25 private sealed class AsyncLocalStackWrapper : Stack
26 {
27 private readonly AsyncLocal<StackNode> _stack;
28
29 public override int Count => _stack.Value?.Count ?? 0;
30
32 {
33 _stack = stack;
34 }
35
36 public override void Clear()
37 {
38 _stack.Value = null;
39 }
40
41 public override object Clone()
42 {
44 }
45
46 public override IEnumerator GetEnumerator()
47 {
48 return GetEnumerator(_stack.Value);
49 }
50
51 public override object Peek()
52 {
53 return _stack.Value?.Value;
54 }
55
56 public override bool Contains(object obj)
57 {
58 for (StackNode stackNode = _stack.Value; stackNode != null; stackNode = stackNode.Prev)
59 {
60 if (obj == null)
61 {
62 if (stackNode.Value == null)
63 {
64 return true;
65 }
66 }
67 else if (obj.Equals(stackNode.Value))
68 {
69 return true;
70 }
71 }
72 return false;
73 }
74
75 public override void CopyTo(Array array, int index)
76 {
77 for (StackNode stackNode = _stack.Value; stackNode != null; stackNode = stackNode.Prev)
78 {
79 array.SetValue(stackNode.Value, index++);
80 }
81 }
82
84 {
85 while (n != null)
86 {
87 yield return n.Value;
88 n = n.Prev;
89 }
90 }
91
92 public override object Pop()
93 {
94 StackNode value = _stack.Value;
95 if (value == null)
96 {
97 base.Pop();
98 }
99 _stack.Value = value.Prev;
100 return value.Value;
101 }
102
103 public override void Push(object obj)
104 {
105 _stack.Value = new StackNode(obj, _stack.Value);
106 }
107
108 public override object[] ToArray()
109 {
110 StackNode stackNode = _stack.Value;
111 if (stackNode == null)
112 {
113 return Array.Empty<object>();
114 }
116 do
117 {
118 list.Add(stackNode.Value);
119 stackNode = stackNode.Prev;
120 }
121 while (stackNode != null);
122 return list.ToArray();
123 }
124 }
125
127
129
130 private readonly Stack _stackWrapper;
131
133
135 {
136 get
137 {
138 return _activityId.Value;
139 }
140 set
141 {
142 _activityId.Value = value;
143 }
144 }
145
150
152 {
154 }
155
157 {
159 }
160
162 {
163 if (operationId == null)
164 {
165 throw new ArgumentNullException("operationId");
166 }
168 }
169}
virtual void Push(object? obj)
Definition Stack.cs:357
virtual ? object Pop()
Definition Stack.cs:345
StackNode(object value, StackNode prev=null)
readonly AsyncLocal< Guid > _activityId
readonly AsyncLocal< StackNode > _stack
void StartLogicalOperation(object operationId)
static Guid NewGuid()
Definition Guid.cs:1283