public static void SingleThreadLockOwnerMiscellaneousTest()
{
var trwl = new TestReaderWriterLock();
TestLockCookie tlc, tlc2;
// Read lock owner can upgrade to a write lock
trwl.AcquireReaderLock();
tlc = trwl.UpgradeToWriterLock();
trwl.DowngradeFromWriterLock(tlc);
trwl.ReleaseReaderLock();
// Can acquire and release a recursive write lock in multiple ways
trwl.AcquireWriterLock();
trwl.AcquireWriterLock();
trwl.ReleaseWriterLock();
trwl.AcquireReaderLock();
trwl.ReleaseReaderLock();
trwl.UpgradeToWriterLock();
trwl.ReleaseWriterLock();
trwl.ReleaseWriterLock();
// Typical upgrade with single read lock
trwl.AcquireReaderLock();
tlc = trwl.UpgradeToWriterLock();
trwl.DowngradeFromWriterLock(tlc);
trwl.ReleaseReaderLock();
// Write lock can be taken with UpgradeToWriterLock when no read lock is held, and with that lock cookie,
// DowngradeFromWriterLock does not acquire a read lock
tlc = trwl.UpgradeToWriterLock();
tlc2 = trwl.UpgradeToWriterLock();
trwl.DowngradeFromWriterLock(tlc2);
trwl.DowngradeFromWriterLock(tlc);
// Upgrading from recursive read lock downgrades back to recursive read lock
trwl.AcquireReaderLock();
trwl.AcquireReaderLock();
tlc = trwl.UpgradeToWriterLock();
trwl.DowngradeFromWriterLock(tlc);
trwl.ReleaseReaderLock();
trwl.ReleaseReaderLock();
// Can downgrade from any write lock level, and to any read lock level with lock cookie from ReleaseLock
trwl.AcquireReaderLock();
trwl.AcquireReaderLock();
tlc = trwl.ReleaseLock();
trwl.AcquireWriterLock();
trwl.AcquireWriterLock();
trwl.DowngradeFromWriterLock(tlc);
trwl.ReleaseReaderLock();
trwl.ReleaseReaderLock();
// Typical release/restore
{
trwl.AcquireReaderLock();
trwl.AcquireReaderLock();
tlc = trwl.ReleaseLock();
trwl.RestoreLock(tlc);
trwl.ReleaseReaderLock();
trwl.ReleaseReaderLock();
trwl.AcquireWriterLock();
trwl.AcquireWriterLock();
tlc = trwl.ReleaseLock();
trwl.RestoreLock(tlc);
trwl.ReleaseWriterLock();
trwl.ReleaseWriterLock();
}
// Can restore to any read lock level with lock cookie from UpgradeToWriterLock
trwl.AcquireReaderLock();
trwl.AcquireReaderLock();
tlc = trwl.UpgradeToWriterLock();
trwl.ReleaseWriterLock();
trwl.RestoreLock(tlc);
trwl.ReleaseReaderLock();
trwl.ReleaseReaderLock();
trwl.Dispose();
}