From 36e827b0be9356e93a3e4f0e7670f055a29004fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Laval?= Date: Wed, 22 Sep 2010 11:01:10 +0100 Subject: [PATCH] Also set readerDoneEvent when exiting an upgradeable lock and reader condition is correct. 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs b/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs index eb42055eda9..07f1dd1f9e7 100644 --- a/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs +++ b/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs @@ -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 () -- GitLab