MediumLock.h revision 0b7e814ff55b414309dab6dfddb70194d696a647
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/* $Id$ */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/** @file
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync * VirtualBox medium object lock collections
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/*
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Copyright (C) 2010 Sun Microsystems, Inc.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * available from http://www.virtualbox.org. This file is free software;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * General Public License (GPL) as published by the Free Software
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * additional information or have any questions.
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#ifndef ____H_MEDIUMLOCK
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define ____H_MEDIUMLOCK
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/* interface definitions */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#include "VBox/com/VirtualBox.h"
f5e53763b0a581b0299e98028c6c52192eb06785vboxsync#include "VirtualBoxBase.h"
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#include "AutoCaller.h"
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync#include <iprt/types.h>
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync#include <list>
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#include <map>
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncclass Medium;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncclass MediumAttachment;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsync/**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Single entry for medium lock lists. Has a medium object reference,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * information about what kind of lock should be taken, and if it is
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * locked right now.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncclass MediumLock
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync{
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncpublic:
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Default medium lock constructor.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync MediumLock();
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Default medium lock destructor.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync ~MediumLock();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * Create a new medium lock description
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync *
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * @param aMedium Reference to medium object
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * @param aLockWrite @c true means a write lock should be taken
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync MediumLock(const ComObjPtr<Medium> &aMedium, bool aLockWrite);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Copy constructor. Needed because we contain an AutoCaller
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * instance which is deliberately not copyable. The copy is not
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * marked as locked, so be careful.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aMediumLock Reference to source object.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync MediumLock(const MediumLock &aMediumLock);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Update a medium lock description
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @note May be only used in unlocked state.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aLockWrite @c true means a write lock should be taken
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT UpdateLock(bool aLockWrite);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Get medium object reference.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync const ComObjPtr<Medium> &GetMedium() const;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Get medium object lock request type.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool GetLockRequest() const;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Acquire a medium lock.
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync *
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * @return COM status code
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync HRESULT Lock();
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /**
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * Release a medium lock.
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync *
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * @return COM status code
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsync */
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsync HRESULT Unlock();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncprivate:
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync ComObjPtr<Medium> mMedium;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync AutoCaller mMediumCaller;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool mLockWrite;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool mIsLocked;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Flag whether the medium was skipped when taking the locks.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Only existing and accessible media objects need to be locked. */
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync bool mLockSkipped;
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync};
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Medium lock list. Meant for storing the ordered locking information
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * for a single medium chain.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncclass MediumLockList
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync{
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncpublic:
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* Base list data type. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync typedef std::list<MediumLock> Base;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Default medium lock list constructor.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync MediumLockList();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Default medium lock list destructor.
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync ~MediumLockList();
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * Checks if medium lock declaration list is empty.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * @return true if list is empty.
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool IsEmpty();
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * Add a new medium lock declaration to the end of the list.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @note May be only used in unlocked state.
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync *
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * @return COM status code
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aMedium Reference to medium object
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aLockWrite @c true means a write lock should be taken
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT Append(const ComObjPtr<Medium> &aMedium, bool aLockWrite);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Add a new medium lock declaration to the beginning of the list.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @note May be only used in unlocked state.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aMedium Reference to medium object
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aLockWrite @c true means a write lock should be taken
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT Prepend(const ComObjPtr<Medium> &aMedium, bool aLockWrite);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Update a medium lock declaration.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @note May be only used in unlocked state.
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aMedium Reference to medium object
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * @param aLockWrite @c true means a write lock should be taken
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT Update(const ComObjPtr<Medium> &aMedium, bool aLockWrite);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Remove a medium lock declaration and return an updated iterator.
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync *
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync * @note May be used in locked state.
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * @param aIt Iterator for the element to remove
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync HRESULT RemoveByIterator(Base::iterator &aIt);
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync /**
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * Clear all medium lock declaration.
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync *
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * @note Implicitly unlocks all locks.
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT Clear();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Get iterator begin() for base list.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync Base::iterator GetBegin();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Get iterator end() for base list.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync Base::iterator GetEnd();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Acquire all medium locks "atomically", i.e. all or nothing.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT Lock();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync * Release all medium locks.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT Unlock();
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncprivate:
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync Base mMediumLocks;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool mIsLocked;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync};
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Medium lock list map. Meant for storing a collection of lock lists.
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync * The usual use case is creating such a map when locking all medium chains
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * belonging to one VM, however that's not the limit. Be creative.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsyncclass MediumLockListMap
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync{
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsyncpublic:
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /**
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * Default medium lock list map constructor.
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync MediumLockListMap();
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /**
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * Default medium lock list map destructor.
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync ~MediumLockListMap();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Checks if medium lock list map is empty.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * @return true if list is empty.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool IsEmpty();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * Insert a new medium lock list into the map.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * @note May be only used in unlocked state.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * @param aMediumAttachment Reference to medium attachment object, the key.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aMediumLockList Reference to medium lock list object
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT Insert(const ComObjPtr<MediumAttachment> &aMediumAttachment, MediumLockList *aMediumLockList);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Replace the medium lock list key by a different one.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @note May be used in locked state.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync * @param aMediumAttachmentOld Reference to medium attachment object.
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync * @param aMediumAttachmentNew Reference to medium attachment object.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT ReplaceKey(const ComObjPtr<MediumAttachment> &aMediumAttachmentOld, const ComObjPtr<MediumAttachment> &aMediumAttachmentNew);
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /**
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * Remove a medium lock list from the map. The list will get deleted.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @note May be only used in unlocked state.
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aMediumAttachment Reference to medium attachment object, the key.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync HRESULT Remove(const ComObjPtr<MediumAttachment> &aMediumAttachment);
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Clear all medium lock declarations in this map.
2e5aced57476316542e80047953840c7b4887337vboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @note Implicitly unlocks all locks.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * @return COM status code
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync HRESULT Clear();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Get the medium lock list identified by the given key.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @note May be used in locked state.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param aMediumAttachment Key for medium attachment object.
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync * @param aMediumLockList Out: medium attachment object reference.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT Get(const ComObjPtr<MediumAttachment> &aMediumAttachment, MediumLockList * &aMediumLockList);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Acquire all medium locks "atomically", i.e. all or nothing.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync * @return COM status code
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync */
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync HRESULT Lock();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Release all medium locks.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @return COM status code
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync HRESULT Unlock();
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncprivate:
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync typedef std::map<ComObjPtr<MediumAttachment>, MediumLockList *> Base;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync Base mMediumLocks;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool mIsLocked;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync};
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync#endif /* !____H_MEDIUMLOCK */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync