Also set readerDoneEvent when exiting an upgradeable lock and reader condition is...
authorJérémie Laval <jeremie.laval@gmail.com>
Wed, 22 Sep 2010 10:01:10 +0000 (11:01 +0100)
committerJérémie Laval <jeremie.laval@gmail.com>
Wed, 22 Sep 2010 10:04:03 +0000 (11:04 +0100)
It could cause a deadlock when a writer tested the rwlock value before RwRead was removed and another Upgradeable operation happened at the same time.

mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs

index eb42055eda9fcfa54e24274b981e3a38e0b4ef8d..07f1dd1f9e7c5c3aa415f16e57737fb2ca2e6f43 100644 (file)
@@ -292,7 +292,8 @@ namespace System.Threading {
 
                        ctstate.LockState ^= LockState.Upgradable;
                        ctstate.UpgradeableRecursiveCount--;
-                       Interlocked.Add (ref rwlock, -RwRead);
+                       if (Interlocked.Add (ref rwlock, -RwRead) >> RwReadBit == 0)
+                               readerDoneEvent.Set ();
                }
 
                public void Dispose ()