//BUG FIX 61 ... lck.Dispose used to cause potential race condition //bug fix 61 ... now lck.Dispose causes compiler error thanks to NotDirectlyInvocableAttribute //bug fix 61 ... which now annotates locked resource object's dispose method. They must be disposed //bug fix 61 ... via using, must be declared inline, must not be disposed manually. public static void DemonstrateDoubleDispose() { using (var bv = new BasicVault <DateTime>(DateTime.Now, TimeSpan.FromMilliseconds(250))) { { using var lck = bv.Lock(); Console.WriteLine(lck.Value.ToString("O")); lck.Value = lck.Value + TimeSpan.FromDays(25); //BUG 61 -- potential race condition / Known Flaw #1 //BUG 61 FIX -- POTENTIAL RACE CONDITION -- DO NOT DISPOSE MANUALLY IN THIS MANNER! //lck.Dispose(); AnotherDemonstrationOfBug61Fix(in lck); Console.WriteLine(lck.Value.ToString("O")); } //don't want this line but it will not trigger the NotDirectlyInvocable error because basic vault ctor not annotated with NotDirectlyInvocableAttribute // bv.Dispose(); } }
public static void TestBasicVaultOfNullableNotUnmanagedValueType() { BasicVault <NotUnmanagedButVaultSafeValueType> bv = new BasicVault <NotUnmanagedButVaultSafeValueType>(new NotUnmanagedButVaultSafeValueType("Chris")); using (var lck = bv.Lock()) { Console.WriteLine(lck.Value.Name); } var thisTimeWithJohn = CreateBasicVault((string s) => new NotUnmanagedButVaultSafeValueType(s)); using (var lck = thisTimeWithJohn.Lock()) { Console.WriteLine(lck.Value.Name); } //BUG 49 fix verification BasicVault <NotUnmanagedButVaultSafeValueType?> nullableVb = new BasicVault <NotUnmanagedButVaultSafeValueType?>(null, TimeSpan.FromSeconds(2)); using (var lck = nullableVb.Lock()) { Console.WriteLine(lck.Value?.Name ?? "NULL"); lck.Value = new NotUnmanagedButVaultSafeValueType("Atticus"); } //Bug 49 fix verification as applied to Type Argument BasicVault <NotUnmanagedButVaultSafeValueType?> nullableVb2 = CreateBasicVault((string s) => (NotUnmanagedButVaultSafeValueType?)new NotUnmanagedButVaultSafeValueType(s)); using (var lck = nullableVb2.SpinLock()) { Console.WriteLine(lck.Value?.ToString() ?? "NULL"); lck.Value = null; Console.WriteLine(lck.Value?.ToString() ?? "NULL"); } }