private void Cleanup(bool disposing)
 {
     switch (_haveLock)
     {
         case ReadOrWrite.Read:
             _lock.ReleaseReadLock();
             break;
         case ReadOrWrite.Write:
             _lock.ReleaseWriteLock();
             break;
         default:
             // already ran cleanup, just return immediately instead of re-disposing below
             return;
     }
     _haveLock = ReadOrWrite.None;
     _lock.Dispose();
     _lock = null;
     if (disposing)
         GC.SuppressFinalize(this);
 }
 internal LockHolder(GlobalReaderWriterLock theLock, ReadOrWrite rw)
 {
     _lock = theLock;
     switch (rw)
     {
         case ReadOrWrite.Read:
             _lock.AcquireReadLock();
             break;
         case ReadOrWrite.Write:
             _lock.AcquireWriteLock();
             break;
     }
     _haveLock = rw;
 }