예제 #1
0
 //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();
     }
 }
예제 #2
0
        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");
            }
        }