Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
TraceSource.cs
Go to the documentation of this file.
1#define TRACE
4
5namespace System.Diagnostics;
6
7public class TraceSource
8{
10
11 private static int s_LastCollectionCount;
12
13 private volatile SourceSwitch _internalSwitch;
14
16
17 private readonly SourceLevels _switchLevel;
18
19 private readonly string _sourceName;
20
21 internal volatile bool _initCalled;
22
24
26 {
27 get
28 {
29 Initialize();
30 if (_attributes == null)
31 {
33 }
34 return _attributes;
35 }
36 }
37
38 public string Name => _sourceName;
39
41 {
42 get
43 {
44 Initialize();
45 return _listeners;
46 }
47 }
48
50 {
51 get
52 {
53 Initialize();
54 return _internalSwitch;
55 }
56 set
57 {
58 if (value == null)
59 {
60 throw new ArgumentNullException("Switch");
61 }
62 Initialize();
64 }
65 }
66
67 public TraceSource(string name)
68 : this(name, SourceLevels.Off)
69 {
70 }
71
73 {
74 if (name == null)
75 {
76 throw new ArgumentNullException("name");
77 }
78 if (name.Length == 0)
79 {
81 }
82 _sourceName = name;
85 {
88 }
89 }
90
91 private static void _pruneCachedTraceSources()
92 {
94 {
96 {
97 return;
98 }
100 for (int i = 0; i < s_tracesources.Count; i++)
101 {
102 if (s_tracesources[i].TryGetTarget(out var _))
103 {
105 }
106 }
107 if (list.Count < s_tracesources.Count)
108 {
109 s_tracesources.Clear();
110 s_tracesources.AddRange(list);
111 s_tracesources.TrimExcess();
112 }
114 }
115 }
116
117 private void Initialize()
118 {
119 if (_initCalled)
120 {
121 return;
122 }
123 lock (this)
124 {
125 if (!_initCalled)
126 {
127 NoConfigInit();
128 _initCalled = true;
129 }
130 }
131 }
132
139
140 public void Close()
141 {
142 if (_listeners == null)
143 {
144 return;
145 }
147 {
148 foreach (TraceListener listener in _listeners)
149 {
150 listener.Close();
151 }
152 }
153 }
154
155 public void Flush()
156 {
157 if (_listeners == null)
158 {
159 return;
160 }
162 {
164 {
165 foreach (TraceListener listener in _listeners)
166 {
167 listener.Flush();
168 }
169 return;
170 }
171 }
173 {
174 if (!listener2.IsThreadSafe)
175 {
177 {
178 listener2.Flush();
179 }
180 }
181 else
182 {
183 listener2.Flush();
184 }
185 }
186 }
187
188 protected internal virtual string[]? GetSupportedAttributes()
189 {
190 return null;
191 }
192
193 internal static void RefreshAll()
194 {
196 {
198 for (int i = 0; i < s_tracesources.Count; i++)
199 {
200 if (s_tracesources[i].TryGetTarget(out var target))
201 {
202 target.Refresh();
203 }
204 }
205 }
206 }
207
208 internal void Refresh()
209 {
210 if (!_initCalled)
211 {
212 Initialize();
213 }
214 }
215
216 [Conditional("TRACE")]
217 public void TraceEvent(TraceEventType eventType, int id)
218 {
219 Initialize();
220 if (!_internalSwitch.ShouldTrace(eventType) || _listeners == null)
221 {
222 return;
223 }
226 {
228 {
229 for (int i = 0; i < _listeners.Count; i++)
230 {
232 traceListener.TraceEvent(eventCache, Name, eventType, id);
233 if (Trace.AutoFlush)
234 {
235 traceListener.Flush();
236 }
237 }
238 return;
239 }
240 }
241 for (int j = 0; j < _listeners.Count; j++)
242 {
244 if (!traceListener2.IsThreadSafe)
245 {
247 {
248 traceListener2.TraceEvent(eventCache, Name, eventType, id);
249 if (Trace.AutoFlush)
250 {
251 traceListener2.Flush();
252 }
253 }
254 }
255 else
256 {
257 traceListener2.TraceEvent(eventCache, Name, eventType, id);
258 if (Trace.AutoFlush)
259 {
260 traceListener2.Flush();
261 }
262 }
263 }
264 }
265
266 [Conditional("TRACE")]
267 public void TraceEvent(TraceEventType eventType, int id, string? message)
268 {
269 Initialize();
270 if (!_internalSwitch.ShouldTrace(eventType) || _listeners == null)
271 {
272 return;
273 }
276 {
278 {
279 for (int i = 0; i < _listeners.Count; i++)
280 {
282 traceListener.TraceEvent(eventCache, Name, eventType, id, message);
283 if (Trace.AutoFlush)
284 {
285 traceListener.Flush();
286 }
287 }
288 return;
289 }
290 }
291 for (int j = 0; j < _listeners.Count; j++)
292 {
294 if (!traceListener2.IsThreadSafe)
295 {
297 {
298 traceListener2.TraceEvent(eventCache, Name, eventType, id, message);
299 if (Trace.AutoFlush)
300 {
301 traceListener2.Flush();
302 }
303 }
304 }
305 else
306 {
307 traceListener2.TraceEvent(eventCache, Name, eventType, id, message);
308 if (Trace.AutoFlush)
309 {
310 traceListener2.Flush();
311 }
312 }
313 }
314 }
315
316 [Conditional("TRACE")]
317 public void TraceEvent(TraceEventType eventType, int id, string? format, params object?[]? args)
318 {
319 Initialize();
320 if (!_internalSwitch.ShouldTrace(eventType) || _listeners == null)
321 {
322 return;
323 }
326 {
328 {
329 for (int i = 0; i < _listeners.Count; i++)
330 {
332 traceListener.TraceEvent(eventCache, Name, eventType, id, format, args);
333 if (Trace.AutoFlush)
334 {
335 traceListener.Flush();
336 }
337 }
338 return;
339 }
340 }
341 for (int j = 0; j < _listeners.Count; j++)
342 {
344 if (!traceListener2.IsThreadSafe)
345 {
347 {
348 traceListener2.TraceEvent(eventCache, Name, eventType, id, format, args);
349 if (Trace.AutoFlush)
350 {
351 traceListener2.Flush();
352 }
353 }
354 }
355 else
356 {
357 traceListener2.TraceEvent(eventCache, Name, eventType, id, format, args);
358 if (Trace.AutoFlush)
359 {
360 traceListener2.Flush();
361 }
362 }
363 }
364 }
365
366 [Conditional("TRACE")]
367 public void TraceData(TraceEventType eventType, int id, object? data)
368 {
369 Initialize();
370 if (!_internalSwitch.ShouldTrace(eventType) || _listeners == null)
371 {
372 return;
373 }
376 {
378 {
379 for (int i = 0; i < _listeners.Count; i++)
380 {
382 traceListener.TraceData(eventCache, Name, eventType, id, data);
383 if (Trace.AutoFlush)
384 {
385 traceListener.Flush();
386 }
387 }
388 return;
389 }
390 }
391 for (int j = 0; j < _listeners.Count; j++)
392 {
394 if (!traceListener2.IsThreadSafe)
395 {
397 {
398 traceListener2.TraceData(eventCache, Name, eventType, id, data);
399 if (Trace.AutoFlush)
400 {
401 traceListener2.Flush();
402 }
403 }
404 }
405 else
406 {
407 traceListener2.TraceData(eventCache, Name, eventType, id, data);
408 if (Trace.AutoFlush)
409 {
410 traceListener2.Flush();
411 }
412 }
413 }
414 }
415
416 [Conditional("TRACE")]
417 public void TraceData(TraceEventType eventType, int id, params object?[]? data)
418 {
419 Initialize();
420 if (!_internalSwitch.ShouldTrace(eventType) || _listeners == null)
421 {
422 return;
423 }
426 {
428 {
429 for (int i = 0; i < _listeners.Count; i++)
430 {
432 traceListener.TraceData(eventCache, Name, eventType, id, data);
433 if (Trace.AutoFlush)
434 {
435 traceListener.Flush();
436 }
437 }
438 return;
439 }
440 }
441 for (int j = 0; j < _listeners.Count; j++)
442 {
444 if (!traceListener2.IsThreadSafe)
445 {
447 {
448 traceListener2.TraceData(eventCache, Name, eventType, id, data);
449 if (Trace.AutoFlush)
450 {
451 traceListener2.Flush();
452 }
453 }
454 }
455 else
456 {
457 traceListener2.TraceData(eventCache, Name, eventType, id, data);
458 if (Trace.AutoFlush)
459 {
460 traceListener2.Flush();
461 }
462 }
463 }
464 }
465
466 [Conditional("TRACE")]
467 public void TraceInformation(string? message)
468 {
469 TraceEvent(TraceEventType.Information, 0, message, null);
470 }
471
472 [Conditional("TRACE")]
473 public void TraceInformation(string? format, params object?[]? args)
474 {
475 TraceEvent(TraceEventType.Information, 0, format, args);
476 }
477
478 [Conditional("TRACE")]
479 public void TraceTransfer(int id, string? message, Guid relatedActivityId)
480 {
481 Initialize();
483 if (!_internalSwitch.ShouldTrace(TraceEventType.Transfer) || _listeners == null)
484 {
485 return;
486 }
488 {
490 {
491 for (int i = 0; i < _listeners.Count; i++)
492 {
494 traceListener.TraceTransfer(eventCache, Name, id, message, relatedActivityId);
495 if (Trace.AutoFlush)
496 {
497 traceListener.Flush();
498 }
499 }
500 return;
501 }
502 }
503 for (int j = 0; j < _listeners.Count; j++)
504 {
506 if (!traceListener2.IsThreadSafe)
507 {
509 {
510 traceListener2.TraceTransfer(eventCache, Name, id, message, relatedActivityId);
511 if (Trace.AutoFlush)
512 {
513 traceListener2.Flush();
514 }
515 }
516 }
517 else
518 {
519 traceListener2.TraceTransfer(eventCache, Name, id, message, relatedActivityId);
520 if (Trace.AutoFlush)
521 {
522 traceListener2.Flush();
523 }
524 }
525 }
526 }
527}
void Add(TKey key, TValue value)
static readonly object critSec
void TraceInformation(string? format, params object?[]? args)
void TraceEvent(TraceEventType eventType, int id, string? format, params object?[]? args)
TraceSource(string name, SourceLevels defaultLevel)
void TraceEvent(TraceEventType eventType, int id)
volatile TraceListenerCollection _listeners
TraceListenerCollection Listeners
void TraceInformation(string? message)
readonly SourceLevels _switchLevel
void TraceData(TraceEventType eventType, int id, params object?[]? data)
static void _pruneCachedTraceSources()
static readonly List< WeakReference< TraceSource > > s_tracesources
Definition TraceSource.cs:9
volatile SourceSwitch _internalSwitch
void TraceTransfer(int id, string? message, Guid relatedActivityId)
virtual ? string[] GetSupportedAttributes()
void TraceData(TraceEventType eventType, int id, object? data)
void TraceEvent(TraceEventType eventType, int id, string? message)
static bool AutoFlush
Definition Trace.cs:22
static int CollectionCount(int generation)
Definition GC.cs:169
Definition GC.cs:8
static string InvalidNullEmptyArgument
Definition SR.cs:34
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
Definition SR.cs:7