Merge pull request #439 from mono-soc-2012/garyb/iconfix
[mono.git] / mcs / class / System.Core / System.Threading / ReaderWriterLockSlim.cs
index 74320c1e42911011fdee896d90bcf9adf1417faa..512f97b27cb15619cd97894d61102b3cb895806d 100644 (file)
@@ -261,6 +261,7 @@ namespace System.Threading {
 
                                int stateCheck = isUpgradable ? RwWaitUpgrade + RwWait : RwWait;
                                long start = millisecondsTimeout == -1 ? 0 : sw.ElapsedMilliseconds;
+                               int registration = isUpgradable ? RwWaitUpgrade : RwWait;
 
                                do {
                                        int state = rwlock;
@@ -268,7 +269,8 @@ namespace System.Threading {
                                        if (state <= stateCheck) {
                                                try {}
                                                finally {
-                                                       if (Interlocked.CompareExchange (ref rwlock, RwWrite, state) == state) {
+                                                       var toWrite = state + RwWrite - (registered ? registration : 0);
+                                                       if (Interlocked.CompareExchange (ref rwlock, toWrite, state) == state) {
                                                                writerDoneEvent.Reset ();
                                                                ctstate.LockState ^= LockState.Write;
                                                                ++ctstate.WriterRecursiveCount;
@@ -452,7 +454,7 @@ namespace System.Threading {
                                return rwlock >= RwRead && CurrentThreadState.LockState.Has (LockState.Read);
                        }
                }
-               
+
                public bool IsWriteLockHeld {
                        get {
                                return (rwlock & RwWrite) > 0 && CurrentThreadState.LockState.Has (LockState.Write);