public static void DowngradeQuirks_ChangedInDotNetCore()
{
var trwl = new TestReaderWriterLock();
TestLockCookie tlc;
// Downgrade quirk when downgrading from a state where multiple recursive write locks are held, when the lock cookie
// was obtained from a state where:
// - No lock was held
// - When any number of recursive write locks are held
// The expectation in both cases is that a downgrade respects the lock cookie and restores the write lock recursion
// level to the point indicated by the lock cookie.
{
// Lock cookie obtained when no lock is held
tlc = trwl.UpgradeToWriterLock();
trwl.AcquireWriterLock();
trwl.DowngradeFromWriterLock(tlc);
trwl.VerifyIsReaderLockHeld(false);
trwl.VerifyIsWriterLockHeld(false);
// Lock cookie obtained when write locks are held
trwl.AcquireWriterLock();
tlc = trwl.UpgradeToWriterLock();
trwl.AcquireWriterLock();
trwl.DowngradeFromWriterLock(tlc);
trwl.VerifyIsReaderLockHeld(false);
trwl.VerifyIsWriterLockHeld(true);
trwl.ReleaseWriterLock();
trwl.VerifyIsWriterLockHeld(false);
}
// Cannot downgrade to a recursive write lock level greater than or equal to the current
trwl.AcquireWriterLock();
trwl.AcquireWriterLock();
tlc = trwl.UpgradeToWriterLock();
trwl.ReleaseWriterLock();
trwl.DowngradeFromWriterLock(tlc, InvalidLockCookieExceptionHResult);
trwl.ReleaseWriterLock();
trwl.DowngradeFromWriterLock(tlc, InvalidLockCookieExceptionHResult);
trwl.ReleaseWriterLock();
trwl.VerifyIsReaderLockHeld(false);
trwl.VerifyIsWriterLockHeld(false);
trwl.Dispose();
}