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