MachineImpl.h revision c1eabfdd25befbe50456ee60bf512e437558559e
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * VirtualBox COM class declaration
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * available from http://www.virtualbox.org. This file is free software;
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * you can redistribute it and/or modify it under the terms of the GNU
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * General Public License (GPL) as published by the Free Software
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * additional information or have any questions.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync// generated header
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync#endif /* VBOX_WITH_RESOURCE_USAGE_API */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync////////////////////////////////////////////////////////////////////////////////
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync// helper declarations
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync////////////////////////////////////////////////////////////////////////////////
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync// Machine class
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync////////////////////////////////////////////////////////////////////////////////
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync public VirtualBoxSupportErrorInfoImpl <Machine, IMachine>,
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Internal machine data.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Only one instance of this data exists per every machine --
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * it is shared by the Machine, SessionMachine and all SnapshotMachine
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * instances associated with the given machine using the util::Shareable
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * template through the mData variable.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * @note |const| members are persistent during lifetime so can be
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * accessed without locking.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * @note There is no need to lock anything inside init() or uninit()
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * methods, because they are always serialized (see AutoCaller).
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Data structure to hold information about sessions opened for the
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * given machine.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Control of the direct session opened by openSession() */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync typedef std::list <ComPtr <IInternalSessionControl> > RemoteControlList;
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** list of controls of all opened remote sessions */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** openRemoteSession() and OnSessionEnd() progress indicator */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * PID of the session object that must be passed to openSession()
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * to finalize the openRemoteSession() request
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * (i.e., PID of the process created by openRemoteSession())
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Current session state */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Session type string (for indirect sessions) */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Sesison machine object */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /* Note: These are guarded by VirtualBoxBase::stateLockHandle() */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Pointer to the usage sampling timer. */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Structure to hold processor usage stats. */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync#endif /* VBOX_WITH_RESOURCE_USAGE_API */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Saved state data.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * It's actually only the state file path string, but it needs to be
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * separate from Data, because Machine and SessionMachine instances
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * share it, while SnapshotMachine does not.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * The data variable is |mSSData|.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * User changeable machine data.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * This data is common for all machine snapshots, i.e. it is shared
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * by all SnapshotMachine instances associated with the given machine
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * using the util::Backupable template through the |mUserData| variable.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * SessionMachine instances can alter this data and discard changes.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * @note There is no need to lock anything inside init() or uninit()
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * methods, because they are always serialized (see AutoCaller).
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Hardware data.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * This data is unique for a machine and for every machine snapshot.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Stored using the util::Backupable template in the |mHWData| variable.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * SessionMachine instances can alter this data and discard changes.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync DeviceType_T mBootOrder [SchemaDefs::MaxBootPosition];
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync typedef std::list <ComObjPtr <SharedFolder> > SharedFolderList;
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Hard disk data.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * The usage policy is the same as for HWData, but a separate structure
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * is necessarym because hard disk data requires different procedures when
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * taking or discarding snapshots, etc.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * The data variable is |mHWData|.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync typedef std::list <ComObjPtr <HardDiskAttachment> > HDAttachmentList;
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Right after Machine::fixupHardDisks(true): |true| if hard disks
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * were actually changed, |false| otherwise
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync AnyStateDep = 0, MutableStateDep, MutableOrSavedStateDep
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Helper class that safely manages the machine state dependency by
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * calling Machine::addStateDependency() on construction and
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Machine::releaseStateDependency() on destruction. Intended for Machine
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * children. The usage pattern is:
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * AutoCaller autoCaller (this);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * CheckComRCReturnRC (autoCaller.rc());
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Machine::AutoStateDependency <MutableStateDep> adep (mParent);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * CheckComRCReturnRC (stateDep.rc());
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * // code that depends on the particular machine state
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Note that it is more convenient to use the following individual
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * shortcut classes instead of using this template directly:
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * AutoAnyStateDependency, AutoMutableStateDependency and
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * AutoMutableOrSavedStateDependency. The usage pattern is exactly the
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * same as above except that there is no need to specify the template
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * argument because it is already done by the shortcut class.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * @param taDepType Dependecy type to manage.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync mRC = aThat->addStateDependency (taDepType, &mMachineState,
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Decreases the number of dependencies before the instance is
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * destroyed. Note that will reset #rc() to E_FAIL. */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Restores the number of callers after by #release(). #rc() will be
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * reset to the result of calling addStateDependency() and must be
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * rechecked to ensure the operation succeeded. */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync mRC = mThat->addStateDependency (taDepType, &mMachineState,
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Returns the result of Machine::addStateDependency(). */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Shortcut to SUCCEEDED (rc()). */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Returns the machine state value as returned by
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Machine::addStateDependency(). */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync MachineState_T machineState() const { return mMachineState; }
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync /** Returns the machine state value as returned by
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Machine::addStateDependency(). */
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync BOOL machineRegistered() const { return mRegistered; }
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync DECLARE_CLS_COPY_CTOR_ASSIGN_NOOP (AutoStateDependency)
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Shortcut to AutoStateDependency <AnyStateDep>.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * See AutoStateDependency to get the usage pattern.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Accepts any machine state and guarantees the state won't change before
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * this object is destroyed. If the machine state cannot be protected (as
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * a result of the state change currently in progress), this instance's
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * #rc() method will indicate a failure, and the caller is not allowed to
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * rely on any particular machine state and should return the failed
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * result code to the upper level.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync typedef AutoStateDependency <AnyStateDep> AutoAnyStateDependency;
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Shortcut to AutoStateDependency <MutableStateDep>.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * See AutoStateDependency to get the usage pattern.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Succeeds only if the machine state is in one of the mutable states, and
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * guarantees the given mutable state won't change before this object is
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * destroyed. If the machine is not mutable, this instance's #rc() method
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * will indicate a failure, and the caller is not allowed to rely on any
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * particular machine state and should return the failed result code to
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * the upper level.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Intended to be used within all setter methods of IMachine
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * children objects (DVDDrive, NetworkAdapter, AudioAdapter, etc.) to
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * provide data protection and consistency.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync typedef AutoStateDependency <MutableStateDep> AutoMutableStateDependency;
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Shortcut to AutoStateDependency <MutableOrSavedStateDep>.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * See AutoStateDependency to get the usage pattern.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Succeeds only if the machine state is in one of the mutable states, or
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * if the machine is in the Saved state, and guarantees the given mutable
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * state won't change before this object is destroyed. If the machine is
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * not mutable, this instance's #rc() method will indicate a failure, and
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * the caller is not allowed to rely on any particular machine state and
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * should return the failed result code to the upper level.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * Intended to be used within setter methods of IMachine
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync * children objects that may also operate on Saved machines.
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync typedef AutoStateDependency <MutableOrSavedStateDep> AutoMutableOrSavedStateDependency;
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync enum InitMode { Init_New, Init_Existing, Init_Registered };
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync // public initializer/uninitializer for internal purposes only
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync HRESULT init (VirtualBox *aParent, const BSTR aConfigFile,
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync // IMachine properties
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(Parent))(IVirtualBox **aParent);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(Accessible)) (BOOL *aAccessible);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(AccessError)) (IVirtualBoxErrorInfo **aAccessError);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(Description))(BSTR *aDescription);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMSETTER(Description))(INPTR BSTR aDescription);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMSETTER(OSTypeId)) (INPTR BSTR aOSTypeId);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(MemorySize))(ULONG *memorySize);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMSETTER(MemorySize))(ULONG memorySize);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(MemoryBalloonSize))(ULONG *memoryBalloonSize);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMSETTER(MemoryBalloonSize))(ULONG memoryBalloonSize);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(StatisticsUpdateInterval))(ULONG *statisticsUpdateInterval);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMSETTER(StatisticsUpdateInterval))(ULONG statisticsUpdateInterval);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(MonitorCount))(ULONG *monitorCount);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMSETTER(MonitorCount))(ULONG monitorCount);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(BIOSSettings))(IBIOSSettings **biosSettings);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(HWVirtExEnabled))(TSBool_T *enabled);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMSETTER(HWVirtExEnabled))(TSBool_T enabled);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(SnapshotFolder))(BSTR *aSavedStateFolder);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMSETTER(SnapshotFolder))(INPTR BSTR aSavedStateFolder);
15c5e2945e3abf354a7d822904579c64f7a190c3vboxsync STDMETHOD(COMGETTER(HardDiskAttachments))(IHardDiskAttachmentCollection **attachments);
bool aSetError = false)
void releaseStateDependency();
void uninitDataAndChildObjects();
bool aSetError = false);
bool aSetError = false);
bool aSetError = false);
bool aInformCallbacksAnyway = false);
bool aOnline);
bool isModified();
#ifdef VBOX_WITH_RESOURCE_USAGE_API
void usageSamplerCallback();
void FinalRelease();
// public initializer/uninitializer for internal purposes only
bool checkForDeath();
#if defined (RT_OS_WINDOWS)
struct SnapshotData
struct Uninit {
struct Task;
struct TakeSnapshotTask;
struct DiscardSnapshotTask;
struct DiscardCurrentStateTask;
#if defined(RT_OS_WINDOWS)
int mIPCSem;
void FinalRelease();
// public initializer/uninitializer for internal purposes only
void uninit();
return mPeer;
return this;