[SafeHandle] Make success parameter setting atomic wrt async exception in DangerousAddRef
authorJérémie Laval <jeremie.laval@gmail.com>
Wed, 1 Dec 2010 15:54:48 +0000 (15:54 +0000)
committerJérémie Laval <jeremie.laval@gmail.com>
Wed, 1 Dec 2010 20:00:52 +0000 (20:00 +0000)
mcs/class/corlib/System.Runtime.InteropServices/SafeHandle.cs

index 330e8aa2b56001bb087cac0fd3e900af1f050ba6..6d03daa69368c9debd686e82f5a28d89309a5462 100644 (file)
@@ -120,6 +120,7 @@ namespace System.Runtime.InteropServices
                        if (refcount <= 0)
                                throw new ObjectDisposedException (GetType ().FullName);
 
+                       bool registered = false;
                        int newcount, current;
                        do {
                                current = refcount;
@@ -134,8 +135,14 @@ namespace System.Runtime.InteropServices
                                        //
                                        throw new ObjectDisposedException (GetType ().FullName);
                                }
-                       } while (Interlocked.CompareExchange (ref refcount, newcount, current) != current);
-                       success = true;
+
+                               RuntimeHelpers.PrepareConstrainedRegions ();
+                               try {}
+                               finally {
+                                       if (Interlocked.CompareExchange (ref refcount, newcount, current) == current)
+                                               registered = success = true;
+                               }
+                       } while (!registered);
                }
 
                [ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]