MediumLock.cpp revision 76364cddabfeb143dad91862d41a5638d8860b25
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu * Medium lock management helper classes
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu * Copyright (C) 2010 Oracle Corporation
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu * This file is part of VirtualBox Open Source Edition (OSE), as
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu * available from http://www.virtualbox.org. This file is free software;
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu * you can redistribute it and/or modify it under the terms of the GNU
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu * General Public License (GPL) as published by the Free Software
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu * Foundation, in version 2 as it comes in the "COPYING" file of the
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu : mMedium(NULL), mMediumCaller(NULL), mLockWrite(false),
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuMediumLock::MediumLock(const MediumLock &aMediumLock)
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu : mMedium(aMediumLock.mMedium), mMediumCaller(NULL),
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu mLockWrite(aMediumLock.mLockWrite), mIsLocked(false), mLockSkipped(false)
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuMediumLock::MediumLock(const ComObjPtr<Medium> &aMedium, bool aLockWrite)
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu : mMedium(aMedium), mMediumCaller(NULL), mLockWrite(aLockWrite),
a31148363f598def767ac48c5d82e1572e44b935Gerry Liuconst ComObjPtr<Medium> &MediumLock::GetMedium() const
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu AutoReadLock alock(mMedium COMMA_LOCKVAL_SRC_POS);
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu // rest is done by the list object's destructor
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuHRESULT MediumLockList::Append(const ComObjPtr<Medium> &aMedium, bool aLockWrite)
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu mMediumLocks.push_back(MediumLock(aMedium, aLockWrite));
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuHRESULT MediumLockList::Prepend(const ComObjPtr<Medium> &aMedium, bool aLockWrite)
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu mMediumLocks.push_front(MediumLock(aMedium, aLockWrite));
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuHRESULT MediumLockList::Update(const ComObjPtr<Medium> &aMedium, bool aLockWrite)
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu for (MediumLockList::Base::iterator it = mMediumLocks.begin();
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuHRESULT MediumLockList::RemoveByIterator(Base::iterator &aIt)
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuMediumLockList::Base::iterator MediumLockList::GetBegin()
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuMediumLockList::Base::iterator MediumLockList::GetEnd()
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu for (MediumLockList::Base::iterator it = mMediumLocks.begin();
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu for (MediumLockList::Base::iterator it2 = mMediumLocks.begin();
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu for (MediumLockList::Base::iterator it = mMediumLocks.begin();
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu // rest is done by the map object's destructor
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuHRESULT MediumLockListMap::Insert(const ComObjPtr<MediumAttachment> &aMediumAttachment,
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu mMediumLocks[aMediumAttachment] = aMediumLockList;
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuHRESULT MediumLockListMap::ReplaceKey(const ComObjPtr<MediumAttachment> &aMediumAttachmentOld,
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu const ComObjPtr<MediumAttachment> &aMediumAttachmentNew)
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu MediumLockListMap::Base::iterator it = mMediumLocks.find(aMediumAttachmentOld);
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu mMediumLocks[aMediumAttachmentNew] = pMediumLockList;
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuHRESULT MediumLockListMap::Remove(const ComObjPtr<MediumAttachment> &aMediumAttachment)
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu MediumLockListMap::Base::iterator it = mMediumLocks.find(aMediumAttachment);
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu for (MediumLockListMap::Base::iterator it = mMediumLocks.begin();
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu // need an incremented iterator as otherwise erasing invalidates it
a31148363f598def767ac48c5d82e1572e44b935Gerry LiuHRESULT MediumLockListMap::Get(const ComObjPtr<MediumAttachment> &aMediumAttachment,
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu MediumLockListMap::Base::iterator it = mMediumLocks.find(aMediumAttachment);
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu for (MediumLockListMap::Base::const_iterator it = mMediumLocks.begin();
a31148363f598def767ac48c5d82e1572e44b935Gerry Liu for (MediumLockListMap::Base::const_iterator it2 = mMediumLocks.begin();