/** * Test that saveMMAPV1LockerImpl works by examining the output. */ TEST(LockerImpl, saveAndRestoreGlobal) { Locker::LockSnapshot lockInfo; MMAPV1LockerImpl locker; // No lock requests made, no locks held. locker.saveLockStateAndUnlock(&lockInfo); ASSERT_EQUALS(0U, lockInfo.locks.size()); // Lock the global lock, but just once. locker.lockGlobal(MODE_IX); // We've locked the global lock. This should be reflected in the lockInfo. locker.saveLockStateAndUnlock(&lockInfo); ASSERT(!locker.isLocked()); ASSERT_EQUALS(MODE_IX, lockInfo.globalMode); // Restore the lock(s) we had. locker.restoreLockState(lockInfo); ASSERT(locker.isLocked()); ASSERT(locker.unlockAll()); }
/** * Test that we don't unlock when we have the global lock more than once. */ TEST(LockerImpl, saveAndRestoreGlobalAcquiredTwice) { Locker::LockSnapshot lockInfo; MMAPV1LockerImpl locker; // No lock requests made, no locks held. locker.saveLockStateAndUnlock(&lockInfo); ASSERT_EQUALS(0U, lockInfo.locks.size()); // Lock the global lock. locker.lockGlobal(MODE_IX); locker.lockGlobal(MODE_IX); // This shouldn't actually unlock as we're in a nested scope. ASSERT(!locker.saveLockStateAndUnlock(&lockInfo)); ASSERT(locker.isLocked()); // We must unlockAll twice. ASSERT(!locker.unlockAll()); ASSERT(locker.unlockAll()); }