Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
LazyInitializer.cs
Go to the documentation of this file.
2
3namespace System.Threading;
4
5public static class LazyInitializer
6{
7 public static T EnsureInitialized<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T>([NotNull] ref T? target) where T : class
8 {
9 return Volatile.Read(ref target) ?? EnsureInitializedCore(ref target);
10 }
11
12 private static T EnsureInitializedCore<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T>([NotNull] ref T target) where T : class
13 {
14 try
15 {
17 }
19 {
21 }
22 return target;
23 }
24
25 public static T EnsureInitialized<T>([NotNull] ref T? target, Func<T> valueFactory) where T : class
26 {
27 return Volatile.Read(ref target) ?? EnsureInitializedCore(ref target, valueFactory);
28 }
29
30 private static T EnsureInitializedCore<T>([NotNull] ref T target, Func<T> valueFactory) where T : class
31 {
32 T val = valueFactory();
33 if (val == null)
34 {
36 }
37 Interlocked.CompareExchange(ref target, val, null);
38 return target;
39 }
40
41 public static T EnsureInitialized<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T>([AllowNull] ref T target, ref bool initialized, [NotNullIfNotNull("syncLock")] ref object? syncLock)
42 {
43 if (Volatile.Read(ref initialized))
44 {
45 return target;
46 }
47 return EnsureInitializedCore(ref target, ref initialized, ref syncLock);
48 }
49
50 private static T EnsureInitializedCore<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T>([AllowNull] ref T target, ref bool initialized, [NotNull] ref object syncLock)
51 {
52 lock (EnsureLockInitialized(ref syncLock))
53 {
54 if (!Volatile.Read(ref initialized))
55 {
56 try
57 {
58 target = Activator.CreateInstance<T>();
59 }
61 {
63 }
64 Volatile.Write(ref initialized, value: true);
65 }
66 }
67 return target;
68 }
69
70 public static T EnsureInitialized<T>([AllowNull] ref T target, ref bool initialized, [NotNullIfNotNull("syncLock")] ref object? syncLock, Func<T> valueFactory)
71 {
72 if (Volatile.Read(ref initialized))
73 {
74 return target;
75 }
76 return EnsureInitializedCore(ref target, ref initialized, ref syncLock, valueFactory);
77 }
78
79 private static T EnsureInitializedCore<T>([AllowNull] ref T target, ref bool initialized, [NotNull] ref object syncLock, Func<T> valueFactory)
80 {
81 lock (EnsureLockInitialized(ref syncLock))
82 {
83 if (!Volatile.Read(ref initialized))
84 {
85 target = valueFactory();
86 Volatile.Write(ref initialized, value: true);
87 }
88 }
89 return target;
90 }
91
92 public static T EnsureInitialized<T>([NotNull] ref T? target, [NotNullIfNotNull("syncLock")] ref object? syncLock, Func<T> valueFactory) where T : class
93 {
94 return Volatile.Read(ref target) ?? EnsureInitializedCore(ref target, ref syncLock, valueFactory);
95 }
96
97 private static T EnsureInitializedCore<T>([NotNull] ref T target, [NotNull] ref object syncLock, Func<T> valueFactory) where T : class
98 {
99 lock (EnsureLockInitialized(ref syncLock))
100 {
101 if (Volatile.Read(ref target) == null)
102 {
103 Volatile.Write(ref target, valueFactory());
104 if (target == null)
105 {
107 }
108 }
109 }
110 return target;
111 }
112
113 private static object EnsureLockInitialized([NotNull] ref object syncLock)
114 {
115 return syncLock ?? Interlocked.CompareExchange(ref syncLock, new object(), null) ?? syncLock;
116 }
117}
static ? object CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors|DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type, BindingFlags bindingAttr, Binder? binder, object?[]? args, CultureInfo? culture)
Definition Activator.cs:17
static string Lazy_StaticInit_InvalidOperation
Definition SR.cs:1602
static string Lazy_CreateValue_NoParameterlessCtorForT
Definition SR.cs:1598
Definition SR.cs:7
static int CompareExchange(ref int location1, int value, int comparand)
static object EnsureLockInitialized([NotNull] ref object syncLock)
static T EnsureInitializedCore< T >([NotNull] ref T target, Func< T > valueFactory)
static T EnsureInitialized< T >([NotNull] ref T? target, Func< T > valueFactory)
static bool Read(ref bool location)
Definition Volatile.cs:67
static void Write(ref bool location, bool value)
Definition Volatile.cs:74