diff options
Diffstat (limited to 'src/VBox/Main/src-server/MediumLock.cpp')
-rw-r--r-- | src/VBox/Main/src-server/MediumLock.cpp | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/src/VBox/Main/src-server/MediumLock.cpp b/src/VBox/Main/src-server/MediumLock.cpp index b8b601ca..567973d4 100644 --- a/src/VBox/Main/src-server/MediumLock.cpp +++ b/src/VBox/Main/src-server/MediumLock.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2010 Oracle Corporation + * Copyright (C) 2010-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -74,7 +74,12 @@ bool MediumLock::GetLockRequest() const return mLockWrite; } -HRESULT MediumLock::Lock() +bool MediumLock::IsLocked() const +{ + return mIsLocked; +} + +HRESULT MediumLock::Lock(bool aIgnoreLockedMedia) { if (mIsLocked) return S_OK; @@ -101,9 +106,20 @@ HRESULT MediumLock::Lock() break; default: if (mLockWrite) - rc = mMedium->LockWrite(NULL); + { + if (aIgnoreLockedMedia && ( state == MediumState_LockedRead + || state == MediumState_LockedWrite)) + return S_OK; + else + rc = mMedium->LockWrite(mToken.asOutParam()); + } else - rc = mMedium->LockRead(NULL); + { + if (aIgnoreLockedMedia && state == MediumState_LockedWrite) + return S_OK; + else + rc = mMedium->LockRead(mToken.asOutParam()); + } } if (SUCCEEDED(rc)) { @@ -120,12 +136,10 @@ HRESULT MediumLock::Lock() HRESULT MediumLock::Unlock() { HRESULT rc = S_OK; - if (mIsLocked && !mLockSkipped) + if (mIsLocked && !mLockSkipped && mToken) { - if (mLockWrite) - rc = mMedium->UnlockWrite(NULL); - else - rc = mMedium->UnlockRead(NULL); + mToken->Abandon(); + mToken.setNull(); } mMediumCaller.attach(NULL); mLockSkipped = false; @@ -201,7 +215,7 @@ MediumLockList::Base::iterator MediumLockList::GetEnd() return mMediumLocks.end(); } -HRESULT MediumLockList::Lock() +HRESULT MediumLockList::Lock(bool fSkipOverLockedMedia /* = false */) { if (mIsLocked) return S_OK; @@ -210,7 +224,7 @@ HRESULT MediumLockList::Lock() it != mMediumLocks.end(); it++) { - rc = it->Lock(); + rc = it->Lock(fSkipOverLockedMedia); if (FAILED(rc)) { for (MediumLockList::Base::iterator it2 = mMediumLocks.begin(); @@ -288,7 +302,9 @@ HRESULT MediumLockListMap::Remove(const ComObjPtr<MediumAttachment> &aMediumAtta MediumLockListMap::Base::iterator it = mMediumLocks.find(aMediumAttachment); if (it == mMediumLocks.end()) return VBOX_E_INVALID_OBJECT_STATE; + MediumLockList *pMediumLockList = it->second; mMediumLocks.erase(it); + delete pMediumLockList; return S_OK; } |