SessionImpl.cpp revision 3fcbafc702b34bd28aeef2b98c6986c877ebb89a
8ad79874169cc981a694a15e8a806b9a39133673vboxsync/** @file
b2640405e06105d868b5fc8f7b676bb680884380vboxsync *
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * VBox Client Session COM Class implementation
8ad79874169cc981a694a15e8a806b9a39133673vboxsync */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync/*
8ad79874169cc981a694a15e8a806b9a39133673vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
b2640405e06105d868b5fc8f7b676bb680884380vboxsync *
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * available from http://www.virtualbox.org. This file is free software;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * General Public License (GPL) as published by the Free Software
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b2640405e06105d868b5fc8f7b676bb680884380vboxsync *
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * additional information or have any questions.
b2640405e06105d868b5fc8f7b676bb680884380vboxsync */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#ifdef VBOX_WITH_SYS_V_IPC_SESSION_WATCHER
b2640405e06105d868b5fc8f7b676bb680884380vboxsync# include <errno.h>
b2640405e06105d868b5fc8f7b676bb680884380vboxsync# include <sys/types.h>
b2640405e06105d868b5fc8f7b676bb680884380vboxsync# include <sys/stat.h>
258511aa4b33ed962c316ae5934e400edf09d3d6vboxsync# include <sys/ipc.h>
b2640405e06105d868b5fc8f7b676bb680884380vboxsync# include <sys/sem.h>
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#endif
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync#include "SessionImpl.h"
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include "ConsoleImpl.h"
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include "Global.h"
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include "AutoCaller.h"
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include "Logging.h"
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync#include <VBox/err.h>
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync#include <iprt/process.h>
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#if defined(RT_OS_WINDOWS) || defined (RT_OS_OS2)
8ad79874169cc981a694a15e8a806b9a39133673vboxsync/** VM IPC mutex holder thread */
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncstatic DECLCALLBACK(int) IPCMutexHolderThread (RTTHREAD Thread, void *pvUser);
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync#endif
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/**
8ad79874169cc981a694a15e8a806b9a39133673vboxsync * Local macro to check whether the session is open and return an error if not.
8ad79874169cc981a694a15e8a806b9a39133673vboxsync * @note Don't forget to do |Auto[Reader]Lock alock (this);| before using this
8ad79874169cc981a694a15e8a806b9a39133673vboxsync * macro.
8ad79874169cc981a694a15e8a806b9a39133673vboxsync */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync#define CHECK_OPEN() \
8ad79874169cc981a694a15e8a806b9a39133673vboxsync do { \
8ad79874169cc981a694a15e8a806b9a39133673vboxsync if (mState != SessionState_Open) \
8ad79874169cc981a694a15e8a806b9a39133673vboxsync return setError (E_UNEXPECTED, \
8ad79874169cc981a694a15e8a806b9a39133673vboxsync tr ("The session is not open (session state: %s)"), \
8ad79874169cc981a694a15e8a806b9a39133673vboxsync Global::stringifySessionState(mState)); \
b2640405e06105d868b5fc8f7b676bb680884380vboxsync } while (0)
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync// constructor / destructor
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/////////////////////////////////////////////////////////////////////////////
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncHRESULT Session::FinalConstruct()
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowThisFunc(("\n"));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return init();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncvoid Session::FinalRelease()
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
8ad79874169cc981a694a15e8a806b9a39133673vboxsync LogFlowThisFunc(("\n"));
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync uninit (true /* aFinalRelease */);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync}
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync// public initializer/uninitializer for internal purposes only
8ad79874169cc981a694a15e8a806b9a39133673vboxsync/////////////////////////////////////////////////////////////////////////////
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/**
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * Initializes the Session object.
8ad79874169cc981a694a15e8a806b9a39133673vboxsync */
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncHRESULT Session::init()
8ad79874169cc981a694a15e8a806b9a39133673vboxsync{
8ad79874169cc981a694a15e8a806b9a39133673vboxsync /* Enclose the state transition NotReady->InInit->Ready */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync AutoInitSpan autoInitSpan(this);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync AssertReturn(autoInitSpan.isOk(), E_FAIL);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync LogFlowThisFuncEnter();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mState = SessionState_Closed;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mType = SessionType_Null;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#if defined(RT_OS_WINDOWS)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mIPCSem = NULL;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mIPCThreadSem = NULL;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#elif defined(RT_OS_OS2)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mIPCThread = NIL_RTTHREAD;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mIPCThreadSem = NIL_RTSEMEVENT;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mIPCSem = -1;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync#else
b2640405e06105d868b5fc8f7b676bb680884380vboxsync# error "Port me!"
8ad79874169cc981a694a15e8a806b9a39133673vboxsync#endif
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync /* Confirm a successful initialization when it's the case */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync autoInitSpan.setSucceeded();
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync LogFlowThisFuncLeave();
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync return S_OK;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync}
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync/**
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * Uninitializes the Session object.
8ad79874169cc981a694a15e8a806b9a39133673vboxsync *
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * @note Locks this object for writing.
8ad79874169cc981a694a15e8a806b9a39133673vboxsync */
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncvoid Session::uninit (bool aFinalRelease)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
8ad79874169cc981a694a15e8a806b9a39133673vboxsync LogFlowThisFuncEnter();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowThisFunc(("aFinalRelease=%d\n", aFinalRelease));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync /* Enclose the state transition Ready->InUninit->NotReady */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoUninitSpan autoUninitSpan(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (autoUninitSpan.uninitDone())
8ad79874169cc981a694a15e8a806b9a39133673vboxsync {
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowThisFunc(("Already uninitialized.\n"));
b4a81d521ea7f88aca6f77b2725541e58a2dc018vboxsync LogFlowThisFuncLeave();
8ad79874169cc981a694a15e8a806b9a39133673vboxsync return;
b4a81d521ea7f88aca6f77b2725541e58a2dc018vboxsync }
cba644d3694119a648f130178a8d84d70ba3f88dvboxsync
d548194f74175bd02f817e8a95fccdec9604b938vboxsync /* close() needs write lock */
cba644d3694119a648f130178a8d84d70ba3f88dvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync if (mState != SessionState_Closed)
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync {
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Assert (mState == SessionState_Open ||
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync mState == SessionState_Spawning);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync HRESULT rc = close (aFinalRelease, false /* aFromServer */);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertComRC (rc);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync LogFlowThisFuncLeave();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync// ISession properties
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/////////////////////////////////////////////////////////////////////////////
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncSTDMETHODIMP Session::COMGETTER(State) (SessionState_T *aState)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync CheckComArgOutPointerValid(aState);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoCaller autoCaller(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync *aState = mState;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync return S_OK;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncSTDMETHODIMP Session::COMGETTER(Type) (SessionType_T *aType)
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync{
8ad79874169cc981a694a15e8a806b9a39133673vboxsync CheckComArgOutPointerValid(aType);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoCaller autoCaller(this);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync CHECK_OPEN();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync *aType = mType;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return S_OK;
8ad79874169cc981a694a15e8a806b9a39133673vboxsync}
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncSTDMETHODIMP Session::COMGETTER(Machine) (IMachine **aMachine)
8ad79874169cc981a694a15e8a806b9a39133673vboxsync{
8ad79874169cc981a694a15e8a806b9a39133673vboxsync CheckComArgOutPointerValid(aMachine);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync AutoCaller autoCaller(this);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
91fdb167bd5c9417d9507c1317ae121864fdc9cbvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync CHECK_OPEN();
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync HRESULT rc = E_FAIL;
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (mConsole)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync rc = mConsole->machine().queryInterfaceTo(aMachine);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync else
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync rc = mRemoteMachine.queryInterfaceTo(aMachine);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ComAssertComRC (rc);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return rc;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncSTDMETHODIMP Session::COMGETTER(Console) (IConsole **aConsole)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync CheckComArgOutPointerValid(aConsole);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoCaller autoCaller(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync CHECK_OPEN();
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync HRESULT rc = E_FAIL;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (mConsole)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync rc = mConsole.queryInterfaceTo(aConsole);
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync else
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync rc = mRemoteConsole.queryInterfaceTo(aConsole);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ComAssertComRC (rc);
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return rc;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync// ISession methods
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/////////////////////////////////////////////////////////////////////////////
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsyncSTDMETHODIMP Session::Close()
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowThisFunc(("mState=%d, mType=%d\n", mState, mType));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoCaller autoCaller(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync /* close() needs write lock */
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync CHECK_OPEN();
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync return close (false /* aFinalRelease */, false /* aFromServer */);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync}
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync// IInternalSessionControl methods
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync/////////////////////////////////////////////////////////////////////////////
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsyncSTDMETHODIMP Session::GetPID (ULONG *aPid)
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync{
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AssertReturn(aPid, E_POINTER);
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AutoCaller autoCaller(this);
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync *aPid = (ULONG) RTProcSelf();
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AssertCompile (sizeof (*aPid) == sizeof (RTPROCESS));
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync return S_OK;
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync}
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsyncSTDMETHODIMP Session::GetRemoteConsole (IConsole **aConsole)
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync{
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync LogFlowThisFuncEnter();
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AssertReturn(aConsole, E_POINTER);
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AutoCaller autoCaller(this);
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mState != SessionState_Closed, VBOX_E_INVALID_VM_STATE);
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync AssertMsgReturn (mType == SessionType_Direct && !!mConsole,
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync ("This is not a direct session!\n"), VBOX_E_INVALID_OBJECT_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* return a failure if the session already transitioned to Closing
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync * but the server hasn't processed Machine::OnSessionEnd() yet. */
04ae74690b2f07a5cb3490babe3fd5e0cbdda226vboxsync if (mState != SessionState_Open)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return VBOX_E_INVALID_VM_STATE;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync mConsole.queryInterfaceTo(aConsole);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync LogFlowThisFuncLeave();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return S_OK;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncSTDMETHODIMP Session::AssignMachine (IMachine *aMachine)
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync{
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFuncEnter();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFunc(("aMachine=%p\n", aMachine));
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AutoCaller autoCaller(this);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
0c6fd0fa9727d13b7ba687dd94169ce829723522vboxsync
0c6fd0fa9727d13b7ba687dd94169ce829723522vboxsync AssertReturn(mState == SessionState_Closed, VBOX_E_INVALID_VM_STATE);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
0c6fd0fa9727d13b7ba687dd94169ce829723522vboxsync if (!aMachine)
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync {
0c6fd0fa9727d13b7ba687dd94169ce829723522vboxsync /*
0c6fd0fa9727d13b7ba687dd94169ce829723522vboxsync * A special case: the server informs us that this session has been
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * passed to IVirtualBox::OpenRemoteSession() so this session will
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * become remote (but not existing) when AssignRemoteMachine() is
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * called.
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AssertReturn(mType == SessionType_Null, VBOX_E_INVALID_OBJECT_STATE);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mType = SessionType_Remote;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mState = SessionState_Spawning;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFuncLeave();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync return S_OK;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync }
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync HRESULT rc = E_FAIL;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync /* query IInternalMachineControl interface */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mControl = aMachine;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AssertReturn(!!mControl, E_FAIL);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync rc = mConsole.createObject();
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertComRCReturn (rc, rc);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync rc = mConsole->init (aMachine, mControl);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AssertComRCReturn (rc, rc);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync rc = grabIPCSemaphore();
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync /*
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync * Reference the VirtualBox object to ensure the server is up
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * until the session is closed
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync if (SUCCEEDED(rc))
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync rc = aMachine->COMGETTER(Parent) (mVirtualBox.asOutParam());
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync if (SUCCEEDED(rc))
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync {
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mType = SessionType_Direct;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync mState = SessionState_Open;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync }
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync else
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync {
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync /* some cleanup */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mControl.setNull();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mConsole->uninit();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mConsole.setNull();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync }
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFunc(("rc=%08X\n", rc));
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFuncLeave();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync return rc;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync}
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsyncSTDMETHODIMP Session::AssignRemoteMachine (IMachine *aMachine, IConsole *aConsole)
8ad79874169cc981a694a15e8a806b9a39133673vboxsync{
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFuncEnter();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFunc(("aMachine=%p, aConsole=%p\n", aMachine, aConsole));
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AssertReturn(aMachine && aConsole, E_INVALIDARG);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AutoCaller autoCaller(this);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AssertReturn(mState == SessionState_Closed ||
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mState == SessionState_Spawning, VBOX_E_INVALID_VM_STATE);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync HRESULT rc = E_FAIL;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync /* query IInternalMachineControl interface */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mControl = aMachine;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AssertReturn(!!mControl, E_FAIL); // This test appears to be redundant --JS
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync /// @todo (dmik)
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync // currently, the remote session returns the same machine and
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync // console objects as the direct session, thus giving the
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync // (remote) client full control over the direct session. For the
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync // console, it is the desired behavior (the ability to control
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync // VM execution is a must for the remote session). What about
8ad79874169cc981a694a15e8a806b9a39133673vboxsync // the machine object, we may want to prevent the remote client
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync // from modifying machine data. In this case, we must:
8ad79874169cc981a694a15e8a806b9a39133673vboxsync // 1) assign the Machine object (instead of the SessionMachine
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync // object that is passed to this method) to mRemoteMachine;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync // 2) remove GetMachine() property from the IConsole interface
8ad79874169cc981a694a15e8a806b9a39133673vboxsync // because it always returns the SessionMachine object
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync // (alternatively, we can supply a separate IConsole
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync // implementation that will return the Machine object in
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync // response to GetMachine()).
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mRemoteMachine = aMachine;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mRemoteConsole = aConsole;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync /*
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * Reference the VirtualBox object to ensure the server is up
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * until the session is closed
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync rc = aMachine->COMGETTER(Parent) (mVirtualBox.asOutParam());
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync if (SUCCEEDED(rc))
8ad79874169cc981a694a15e8a806b9a39133673vboxsync {
8ad79874169cc981a694a15e8a806b9a39133673vboxsync /*
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * RemoteSession type can be already set by AssignMachine() when its
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * argument is NULL (a special case)
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync if (mType != SessionType_Remote)
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync mType = SessionType_Existing;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync else
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync Assert (mState == SessionState_Spawning);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync mState = SessionState_Open;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync }
8ad79874169cc981a694a15e8a806b9a39133673vboxsync else
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync {
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync /* some cleanup */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mControl.setNull();
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync mRemoteMachine.setNull();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync mRemoteConsole.setNull();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync }
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFunc(("rc=%08X\n", rc));
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync LogFlowThisFuncLeave();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync return rc;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync}
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsyncSTDMETHODIMP Session::UpdateMachineState (MachineState_T aMachineState)
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync{
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AutoCaller autoCaller(this);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync if (autoCaller.state() != Ready)
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync {
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync /*
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * We might have already entered Session::uninit() at this point, so
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * return silently (not interested in the state change during uninit)
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFunc(("Already uninitialized.\n"));
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync return S_OK;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync }
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync if (mState == SessionState_Closing)
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync {
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync LogFlowThisFunc(("Already being closed.\n"));
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync return S_OK;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync }
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertReturn(!mControl.isNull(), E_FAIL);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertReturn(!mConsole.isNull(), E_FAIL);
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync return mConsole->updateMachineState (aMachineState);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync}
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsyncSTDMETHODIMP Session::Uninitialize()
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync{
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync LogFlowThisFuncEnter();
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync AutoCaller autoCaller(this);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync HRESULT rc = S_OK;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync if (autoCaller.state() == Ready)
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync {
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync /* close() needs write lock */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync LogFlowThisFunc(("mState=%s, mType=%d\n", Global::stringifySessionState(mState), mType));
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync if (mState == SessionState_Closing)
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync {
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync LogFlowThisFunc(("Already being closed.\n"));
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync return S_OK;
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync }
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertReturn(mState == SessionState_Open ||
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync mState == SessionState_Spawning, VBOX_E_INVALID_VM_STATE);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync /* close ourselves */
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync rc = close (false /* aFinalRelease */, true /* aFromServer */);
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync }
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync else if (autoCaller.state() == InUninit)
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync {
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync /*
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync * We might have already entered Session::uninit() at this point,
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * return silently
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync */
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFunc(("Already uninitialized.\n"));
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync }
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync else
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync {
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogWarningThisFunc(("UNEXPECTED uninitialization!\n"));
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync rc = autoCaller.rc();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync }
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync LogFlowThisFunc(("rc=%08X\n", rc));
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFuncLeave();
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync return rc;
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync}
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsyncSTDMETHODIMP Session::OnNetworkAdapterChange(INetworkAdapter *networkAdapter, BOOL changeAdapter)
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync{
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync LogFlowThisFunc(("\n"));
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync AutoCaller autoCaller(this);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync return mConsole->onNetworkAdapterChange(networkAdapter, changeAdapter);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync}
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsyncSTDMETHODIMP Session::OnSerialPortChange(ISerialPort *serialPort)
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync{
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync LogFlowThisFunc(("\n"));
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
4b79f1e3db952307a2b19933efb97ccb871157cfvboxsync AutoCaller autoCaller(this);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync return mConsole->onSerialPortChange(serialPort);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync}
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsyncSTDMETHODIMP Session::OnParallelPortChange(IParallelPort *parallelPort)
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync{
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync LogFlowThisFunc(("\n"));
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync AutoCaller autoCaller(this);
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync return mConsole->onParallelPortChange(parallelPort);
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync}
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync
92de700c41f3803fd020736400a84b4105590eb6vboxsyncSTDMETHODIMP Session::OnStorageControllerChange()
92de700c41f3803fd020736400a84b4105590eb6vboxsync{
92de700c41f3803fd020736400a84b4105590eb6vboxsync LogFlowThisFunc(("\n"));
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
3a828bb90d1afb1dc3184bd90192750a87562d2dvboxsync AutoCaller autoCaller(this);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
3a828bb90d1afb1dc3184bd90192750a87562d2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
92de700c41f3803fd020736400a84b4105590eb6vboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
92de700c41f3803fd020736400a84b4105590eb6vboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
92de700c41f3803fd020736400a84b4105590eb6vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync return mConsole->onStorageControllerChange();
92de700c41f3803fd020736400a84b4105590eb6vboxsync}
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsyncSTDMETHODIMP Session::OnMediumChange(IMediumAttachment *aMediumAttachment, BOOL aForce)
92de700c41f3803fd020736400a84b4105590eb6vboxsync{
92de700c41f3803fd020736400a84b4105590eb6vboxsync LogFlowThisFunc(("\n"));
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
92de700c41f3803fd020736400a84b4105590eb6vboxsync AutoCaller autoCaller(this);
92de700c41f3803fd020736400a84b4105590eb6vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync return mConsole->onMediumChange(aMediumAttachment, aForce);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync}
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsyncSTDMETHODIMP Session::OnCPUChange(ULONG aCPU, BOOL aRemove)
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync{
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync LogFlowThisFunc(("\n"));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoCaller autoCaller(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync return mConsole->onCPUChange(aCPU, aRemove);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsyncSTDMETHODIMP Session::OnVRDPServerChange()
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync{
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync LogFlowThisFunc(("\n"));
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync AutoCaller autoCaller(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsync
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsync return mConsole->onVRDPServerChange();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsyncSTDMETHODIMP Session::OnUSBControllerChange()
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync{
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync LogFlowThisFunc(("\n"));
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsync AutoCaller autoCaller(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return mConsole->onUSBControllerChange();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncSTDMETHODIMP Session::OnSharedFolderChange (BOOL aGlobal)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
8ad79874169cc981a694a15e8a806b9a39133673vboxsync LogFlowThisFunc(("\n"));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoCaller autoCaller(this);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync return mConsole->onSharedFolderChange (aGlobal);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsyncSTDMETHODIMP Session::OnUSBDeviceAttach (IUSBDevice *aDevice,
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync IVirtualBoxErrorInfo *aError,
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync ULONG aMaskedIfs)
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync{
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync LogFlowThisFunc(("\n"));
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync AutoCaller autoCaller(this);
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return mConsole->onUSBDeviceAttach (aDevice, aError, aMaskedIfs);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsyncSTDMETHODIMP Session::OnUSBDeviceDetach (IN_BSTR aId,
ce95f18112057771f68abe58df709edd7c467db1vboxsync IVirtualBoxErrorInfo *aError)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowThisFunc(("\n"));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoCaller autoCaller(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mState == SessionState_Open, VBOX_E_INVALID_VM_STATE);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return mConsole->onUSBDeviceDetach (aId, aError);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsyncSTDMETHODIMP Session::OnShowWindow (BOOL aCheck, BOOL *aCanShow, ULONG64 *aWinId)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoCaller autoCaller(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync if (mState != SessionState_Open)
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync {
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* the call from Machine issued when the session is open can arrive
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * after the session starts closing or gets closed. Note that when
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync * aCheck is false, we return E_FAIL to indicate that aWinId we return
083344b49cc7370da15d3cb7e3a9c9cb2d8dfbb0vboxsync * is not valid */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync *aCanShow = FALSE;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync *aWinId = 0;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return aCheck ? S_OK : E_FAIL;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return mConsole->onShowWindow (aCheck, aCanShow, aWinId);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncSTDMETHODIMP Session::AccessGuestProperty (IN_BSTR aName, IN_BSTR aValue, IN_BSTR aFlags,
8ad79874169cc981a694a15e8a806b9a39133673vboxsync BOOL aIsSetter, BSTR *aRetValue, ULONG64 *aRetTimestamp, BSTR *aRetFlags)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync#ifdef VBOX_WITH_GUEST_PROPS
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AutoCaller autoCaller(this);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync if (mState != SessionState_Open)
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync return setError (VBOX_E_INVALID_VM_STATE,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync tr ("Machine session is not open (session state: %s)."),
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Global::stringifySessionState(mState));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync CheckComArgNotNull(aName);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (!aIsSetter && !VALID_PTR (aRetValue))
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync return E_POINTER;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (!aIsSetter && !VALID_PTR (aRetTimestamp))
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return E_POINTER;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (!aIsSetter && !VALID_PTR (aRetFlags))
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return E_POINTER;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* aValue can be NULL for a setter call if the property is to be deleted. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (aIsSetter && (aValue != NULL) && !VALID_PTR (aValue))
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return E_INVALIDARG;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* aFlags can be null if it is to be left as is */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (aIsSetter && (aFlags != NULL) && !VALID_PTR (aFlags))
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return E_INVALIDARG;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (!aIsSetter)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return mConsole->getGuestProperty (aName, aRetValue, aRetTimestamp, aRetFlags);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync else
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return mConsole->setGuestProperty (aName, aValue, aFlags);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#else /* VBOX_WITH_GUEST_PROPS not defined */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ReturnComNotImplemented();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#endif /* VBOX_WITH_GUEST_PROPS not defined */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsyncSTDMETHODIMP Session::EnumerateGuestProperties (IN_BSTR aPatterns,
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync ComSafeArrayOut(BSTR, aNames),
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync ComSafeArrayOut(BSTR, aValues),
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync ComSafeArrayOut(ULONG64, aTimestamps),
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ComSafeArrayOut(BSTR, aFlags))
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync{
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync#ifdef VBOX_WITH_GUEST_PROPS
220e5884905c24f2f04cb78947913b0e79309b6dvboxsync AutoCaller autoCaller(this);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync if (mState != SessionState_Open)
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync return setError (VBOX_E_INVALID_VM_STATE,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync tr ("Machine session is not open (session state: %s)."),
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Global::stringifySessionState(mState));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn(mType == SessionType_Direct, VBOX_E_INVALID_OBJECT_STATE);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync if (!VALID_PTR (aPatterns) && (aPatterns != NULL))
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync return E_POINTER;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (ComSafeArrayOutIsNull(aNames))
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return E_POINTER;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (ComSafeArrayOutIsNull(aValues))
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync return E_POINTER;
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync if (ComSafeArrayOutIsNull(aTimestamps))
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return E_POINTER;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (ComSafeArrayOutIsNull(aFlags))
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync return E_POINTER;
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync return mConsole->enumerateGuestProperties(aPatterns,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ComSafeArrayOutArg(aNames),
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ComSafeArrayOutArg(aValues),
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync ComSafeArrayOutArg(aTimestamps),
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync ComSafeArrayOutArg(aFlags));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#else /* VBOX_WITH_GUEST_PROPS not defined */
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync ReturnComNotImplemented();
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync#endif /* VBOX_WITH_GUEST_PROPS not defined */
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync}
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync// private methods
b2640405e06105d868b5fc8f7b676bb680884380vboxsync///////////////////////////////////////////////////////////////////////////////
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync/**
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * Closes the current session.
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync *
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * @param aFinalRelease called as a result of FinalRelease()
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync * @param aFromServer called as a result of Uninitialize()
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync *
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * @note To be called only from #uninit(), #Close() or #Uninitialize().
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync * @note Locks this object for writing.
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync */
f0ee209770f633d122076f798c039ab21c55c4bcvboxsyncHRESULT Session::close (bool aFinalRelease, bool aFromServer)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync LogFlowThisFuncEnter();
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync LogFlowThisFunc(("aFinalRelease=%d, isFromServer=%d\n",
b2640405e06105d868b5fc8f7b676bb680884380vboxsync aFinalRelease, aFromServer));
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AutoCaller autoCaller(this);
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync AssertComRCReturnRC(autoCaller.rc());
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync LogFlowThisFunc(("mState=%s, mType=%d\n", Global::stringifySessionState(mState), mType));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync if (mState != SessionState_Open)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync {
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Assert (mState == SessionState_Spawning);
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync /* The session object is going to be uninitialized before it has been
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync * assigned a direct console of the machine the client requested to open
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync * a remote session to using IVirtualBox:: openRemoteSession(). It is OK
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync * only if this close reqiest comes from the server (for example, it
f0ee209770f633d122076f798c039ab21c55c4bcvboxsync * detected that the VM process it started terminated before opening a
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * direct session). Otherwise, it means that the client is too fast and
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * trying to close the session before waiting for the progress object it
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * got from IVirtualBox:: openRemoteSession() to complete, so assert. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Assert (aFromServer);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mState = SessionState_Closed;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync mType = SessionType_Null;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#if defined(RT_OS_WINDOWS)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Assert (!mIPCSem && !mIPCThreadSem);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#elif defined(RT_OS_OS2)
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync Assert (mIPCThread == NIL_RTTHREAD &&
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync mIPCThreadSem == NIL_RTSEMEVENT);
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync#elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER)
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync Assert (mIPCSem == -1);
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync#else
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync# error "Port me!"
8ad79874169cc981a694a15e8a806b9a39133673vboxsync#endif
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync LogFlowThisFuncLeave();
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync return S_OK;
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync }
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync /* go to the closing state */
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync mState = SessionState_Closing;
5a9cd9ff1147e9845e0d3fc020973df2d3e66daavboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync if (mType == SessionType_Direct)
060bf5e6f4ef4f8008cde90ed72d96a514664b25vboxsync {
060bf5e6f4ef4f8008cde90ed72d96a514664b25vboxsync mConsole->uninit();
060bf5e6f4ef4f8008cde90ed72d96a514664b25vboxsync mConsole.setNull();
060bf5e6f4ef4f8008cde90ed72d96a514664b25vboxsync }
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync else
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync {
147b6ddff14ec450da8593696cf60c4258d61613vboxsync mRemoteMachine.setNull();
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync mRemoteConsole.setNull();
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync }
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync ComPtr<IProgress> progress;
2906c2554adf12dac04c4bdd7e44ec9f960f0390vboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync if (!aFinalRelease && !aFromServer)
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync {
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync /*
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * We trigger OnSessionEnd() only when the session closes itself using
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * Close(). Note that if isFinalRelease = TRUE here, this means that
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * the client process has already initialized the termination procedure
2906c2554adf12dac04c4bdd7e44ec9f960f0390vboxsync * without issuing Close() and the IPC channel is no more operational --
c676658a234a45bfe783320e8a13f6fd4f0425dbvboxsync * so we cannot call the server's method (it will definitely fail). The
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * server will instead simply detect the abnormal client death (since
c676658a234a45bfe783320e8a13f6fd4f0425dbvboxsync * OnSessionEnd() is not called) and reset the machine state to Aborted.
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync */
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync /*
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * while waiting for OnSessionEnd() to complete one of our methods
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * can be called by the server (for example, Uninitialize(), if the
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * direct session has initiated a closure just a bit before us) so
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * we need to release the lock to avoid deadlocks. The state is already
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * SessionState_Closing here, so it's safe.
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync */
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync alock.leave();
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync LogFlowThisFunc(("Calling mControl->OnSessionEnd()...\n"));
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync HRESULT rc = mControl->OnSessionEnd (this, progress.asOutParam());
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync LogFlowThisFunc(("mControl->OnSessionEnd()=%08X\n", rc));
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync alock.enter();
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync /*
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * If we get E_UNEXPECTED this means that the direct session has already
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * been closed, we're just too late with our notification and nothing more
060bf5e6f4ef4f8008cde90ed72d96a514664b25vboxsync */
060bf5e6f4ef4f8008cde90ed72d96a514664b25vboxsync if (mType != SessionType_Direct && rc == E_UNEXPECTED)
060bf5e6f4ef4f8008cde90ed72d96a514664b25vboxsync rc = S_OK;
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync AssertComRC (rc);
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mControl.setNull();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (mType == SessionType_Direct)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync {
b2640405e06105d868b5fc8f7b676bb680884380vboxsync releaseIPCSemaphore();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (!aFinalRelease && !aFromServer)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync {
8ad79874169cc981a694a15e8a806b9a39133673vboxsync /*
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * Wait for the server to grab the semaphore and destroy the session
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync * machine (allowing us to open a new session with the same machine
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * once this method returns)
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Assert (!!progress);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (progress)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync progress->WaitForCompletion (-1);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mState = SessionState_Closed;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mType = SessionType_Null;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* release the VirtualBox instance as the very last step */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mVirtualBox.setNull();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowThisFuncLeave();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return S_OK;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/** @note To be called only from #AssignMachine() */
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsyncHRESULT Session::grabIPCSemaphore()
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync HRESULT rc = E_FAIL;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync /* open the IPC semaphore based on the sessionId and try to grab it */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Bstr ipcId;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync rc = mControl->GetIPCId (ipcId.asOutParam());
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertComRCReturnRC(rc);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowThisFunc(("ipcId='%ls'\n", ipcId.raw()));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#if defined(RT_OS_WINDOWS)
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /*
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync * Since Session is an MTA object, this method can be executed on
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * any thread, and this thread will not necessarily match the thread on
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * which close() will be called later. Therefore, we need a separate
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * thread to hold the IPC mutex and then release it in close().
b2640405e06105d868b5fc8f7b676bb680884380vboxsync */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mIPCThreadSem = ::CreateEvent (NULL, FALSE, FALSE, NULL);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertMsgReturn (mIPCThreadSem,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ("Cannot create an event sem, err=%d", ::GetLastError()),
b2640405e06105d868b5fc8f7b676bb680884380vboxsync E_FAIL);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync void *data [3];
8ad79874169cc981a694a15e8a806b9a39133673vboxsync data [0] = (void *) (BSTR) ipcId;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync data [1] = (void *) mIPCThreadSem;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync data [2] = 0; /* will get an output from the thread */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* create a thread to hold the IPC mutex until signalled to release it */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync RTTHREAD tid;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync int vrc = RTThreadCreate (&tid, IPCMutexHolderThread, (void *) data,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync 0, RTTHREADTYPE_MAIN_WORKER, 0, "IPCHolder");
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertRCReturn (vrc, E_FAIL);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* wait until thread init is completed */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync DWORD wrc = ::WaitForSingleObject (mIPCThreadSem, INFINITE);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertMsg (wrc == WAIT_OBJECT_0, ("Wait failed, err=%d\n", ::GetLastError()));
ce95f18112057771f68abe58df709edd7c467db1vboxsync Assert (data [2]);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
ce95f18112057771f68abe58df709edd7c467db1vboxsync if (wrc == WAIT_OBJECT_0 && data [2])
b2640405e06105d868b5fc8f7b676bb680884380vboxsync {
ce95f18112057771f68abe58df709edd7c467db1vboxsync /* memorize the event sem we should signal in close() */
ce95f18112057771f68abe58df709edd7c467db1vboxsync mIPCSem = (HANDLE) data [2];
b2640405e06105d868b5fc8f7b676bb680884380vboxsync rc = S_OK;
8ad79874169cc981a694a15e8a806b9a39133673vboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync else
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync {
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync ::CloseHandle (mIPCThreadSem);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync mIPCThreadSem = NULL;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync rc = E_FAIL;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync#elif defined(RT_OS_OS2)
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync /* We use XPCOM where any message (including close()) can arrive on any
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync * worker thread (which will not necessarily match this thread that opens
6724f34fdfee01d77d13f23d907d7b79d80e435dvboxsync * the mutex). Therefore, we need a separate thread to hold the IPC mutex
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync * and then release it in close(). */
6724f34fdfee01d77d13f23d907d7b79d80e435dvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync int vrc = RTSemEventCreate (&mIPCThreadSem);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertRCReturn (vrc, E_FAIL);
6724f34fdfee01d77d13f23d907d7b79d80e435dvboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync void *data [3];
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync data [0] = (void *) ipcId.raw();
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync data [1] = (void *) mIPCThreadSem;
ce95f18112057771f68abe58df709edd7c467db1vboxsync data [2] = (void *) false; /* will get the thread result here */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync /* create a thread to hold the IPC mutex until signalled to release it */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync vrc = RTThreadCreate (&mIPCThread, IPCMutexHolderThread, (void *) data,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync 0, RTTHREADTYPE_MAIN_WORKER, 0, "IPCHolder");
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertRCReturn (vrc, E_FAIL);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* wait until thread init is completed */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync vrc = RTThreadUserWait (mIPCThread, RT_INDEFINITE_WAIT);
ce95f18112057771f68abe58df709edd7c467db1vboxsync AssertReturn(RT_SUCCESS(vrc) || vrc == VERR_INTERRUPTED, E_FAIL);
ce95f18112057771f68abe58df709edd7c467db1vboxsync
ce95f18112057771f68abe58df709edd7c467db1vboxsync /* the thread must succeed */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertReturn((bool) data [2], E_FAIL);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER)
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
6de26a0709c5a075db3c7532e7702444cd35afd6vboxsync# ifdef VBOX_WITH_NEW_SYS_V_KEYGEN
6de26a0709c5a075db3c7532e7702444cd35afd6vboxsync Utf8Str ipcKey = ipcId;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync key_t key = RTStrToUInt32(ipcKey.raw());
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertMsgReturn (key != 0,
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync ("Key value of 0 is not valid for IPC semaphore"),
b2640405e06105d868b5fc8f7b676bb680884380vboxsync E_FAIL);
ce95f18112057771f68abe58df709edd7c467db1vboxsync# else /* !VBOX_WITH_NEW_SYS_V_KEYGEN */
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync Utf8Str semName = ipcId;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync char *pszSemName = NULL;
ce95f18112057771f68abe58df709edd7c467db1vboxsync RTStrUtf8ToCurrentCP (&pszSemName, semName);
ce95f18112057771f68abe58df709edd7c467db1vboxsync key_t key = ::ftok (pszSemName, 'V');
6de26a0709c5a075db3c7532e7702444cd35afd6vboxsync RTStrFree (pszSemName);
6de26a0709c5a075db3c7532e7702444cd35afd6vboxsync# endif /* !VBOX_WITH_NEW_SYS_V_KEYGEN */
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync mIPCSem = ::semget (key, 0, 0);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertMsgReturn (mIPCSem >= 0,
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync ("Cannot open IPC semaphore, errno=%d", errno),
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync E_FAIL);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
6de26a0709c5a075db3c7532e7702444cd35afd6vboxsync /* grab the semaphore */
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync ::sembuf sop = { 0, -1, SEM_UNDO };
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync int rv = ::semop (mIPCSem, &sop, 1);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertMsgReturn (rv == 0,
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync ("Cannot grab IPC semaphore, errno=%d", errno),
6de26a0709c5a075db3c7532e7702444cd35afd6vboxsync E_FAIL);
6de26a0709c5a075db3c7532e7702444cd35afd6vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#else
b2640405e06105d868b5fc8f7b676bb680884380vboxsync# error "Port me!"
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#endif
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync return rc;
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/** @note To be called only from #close() */
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncvoid Session::releaseIPCSemaphore()
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* release the IPC semaphore */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#if defined(RT_OS_WINDOWS)
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync if (mIPCSem && mIPCThreadSem)
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync {
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /*
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * tell the thread holding the IPC mutex to release it;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * it will close mIPCSem handle
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync */
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync ::SetEvent (mIPCSem);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync /* wait for the thread to finish */
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync ::WaitForSingleObject (mIPCThreadSem, INFINITE);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync ::CloseHandle (mIPCThreadSem);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync mIPCThreadSem = NULL;
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync mIPCSem = NULL;
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync }
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync#elif defined(RT_OS_OS2)
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync if (mIPCThread != NIL_RTTHREAD)
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync {
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync Assert (mIPCThreadSem != NIL_RTSEMEVENT);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync /* tell the thread holding the IPC mutex to release it */
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync int vrc = RTSemEventSignal (mIPCThreadSem);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync AssertRC (vrc == NO_ERROR);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync /* wait for the thread to finish */
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync vrc = RTThreadUserWait (mIPCThread, RT_INDEFINITE_WAIT);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync Assert (RT_SUCCESS(vrc) || vrc == VERR_INTERRUPTED);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync mIPCThread = NIL_RTTHREAD;
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync }
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync if (mIPCThreadSem != NIL_RTSEMEVENT)
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync {
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync RTSemEventDestroy (mIPCThreadSem);
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync mIPCThreadSem = NIL_RTSEMEVENT;
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync }
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync#elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER)
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync
7796e8b1dcbbe95e91b6f56842324ef07d99f977vboxsync if (mIPCSem >= 0)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync {
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ::sembuf sop = { 0, 1, SEM_UNDO };
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ::semop (mIPCSem, &sop, 1);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync mIPCSem = -1;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#else
b2640405e06105d868b5fc8f7b676bb680884380vboxsync# error "Port me!"
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync#endif
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#if defined(RT_OS_WINDOWS)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/** VM IPC mutex holder thread */
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncDECLCALLBACK(int) IPCMutexHolderThread (RTTHREAD Thread, void *pvUser)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync LogFlowFuncEnter();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Assert (pvUser);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync void **data = (void **) pvUser;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync BSTR sessionId = (BSTR) data [0];
b2640405e06105d868b5fc8f7b676bb680884380vboxsync HANDLE initDoneSem = (HANDLE) data [1];
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync HANDLE ipcMutex = ::OpenMutex (MUTEX_ALL_ACCESS, FALSE, sessionId);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertMsg (ipcMutex, ("cannot open IPC mutex, err=%d\n", ::GetLastError()));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync if (ipcMutex)
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync {
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync /* grab the mutex */
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync DWORD wrc = ::WaitForSingleObject (ipcMutex, 0);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertMsg (wrc == WAIT_OBJECT_0, ("cannot grab IPC mutex, err=%d\n", wrc));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (wrc == WAIT_OBJECT_0)
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsync {
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsync HANDLE finishSem = ::CreateEvent (NULL, FALSE, FALSE, NULL);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync AssertMsg (finishSem, ("cannot create event sem, err=%d\n", ::GetLastError()));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (finishSem)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync {
b2640405e06105d868b5fc8f7b676bb680884380vboxsync data [2] = (void *) finishSem;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* signal we're done with init */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ::SetEvent (initDoneSem);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* wait until we're signaled to release the IPC mutex */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ::WaitForSingleObject (finishSem, INFINITE);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync /* release the IPC mutex */
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync LogFlow (("IPCMutexHolderThread(): releasing IPC mutex...\n"));
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync BOOL success = ::ReleaseMutex (ipcMutex);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertMsg (success, ("cannot release mutex, err=%d\n", ::GetLastError()));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ::CloseHandle (ipcMutex);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ::CloseHandle (finishSem);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* signal we're done */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ::SetEvent (initDoneSem);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync LogFlowFuncLeave();
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync return 0;
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#endif
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync#if defined(RT_OS_OS2)
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync/** VM IPC mutex holder thread */
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsyncDECLCALLBACK(int) IPCMutexHolderThread (RTTHREAD Thread, void *pvUser)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowFuncEnter();
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync Assert (pvUser);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync void **data = (void **) pvUser;
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Utf8Str ipcId = (BSTR) data [0];
b2640405e06105d868b5fc8f7b676bb680884380vboxsync RTSEMEVENT finishSem = (RTSEMEVENT) data [1];
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowFunc (("ipcId='%s', finishSem=%p\n", ipcId.raw(), finishSem));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync HMTX ipcMutex = NULLHANDLE;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync APIRET arc = ::DosOpenMutexSem ((PSZ) ipcId.raw(), &ipcMutex);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertMsg (arc == NO_ERROR, ("cannot open IPC mutex, arc=%ld\n", arc));
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync if (arc == NO_ERROR)
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync {
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync /* grab the mutex */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowFunc (("grabbing IPC mutex...\n"));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync arc = ::DosRequestMutexSem (ipcMutex, SEM_IMMEDIATE_RETURN);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertMsg (arc == NO_ERROR, ("cannot grab IPC mutex, arc=%ld\n", arc));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync if (arc == NO_ERROR)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync {
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* store the answer */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync data [2] = (void *) true;
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync /* signal we're done */
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync int vrc = RTThreadUserSignal (Thread);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertRC (vrc);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* wait until we're signaled to release the IPC mutex */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowFunc (("waiting for termination signal..\n"));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync vrc = RTSemEventWait (finishSem, RT_INDEFINITE_WAIT);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync Assert (arc == ERROR_INTERRUPT || ERROR_TIMEOUT);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync /* release the IPC mutex */
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync LogFlowFunc (("releasing IPC mutex...\n"));
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync arc = ::DosReleaseMutexSem (ipcMutex);
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync AssertMsg (arc == NO_ERROR, ("cannot release mutex, arc=%ld\n", arc));
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ::DosCloseMutexSem (ipcMutex);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync }
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync /* store the answer */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync data [1] = (void *) false;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /* signal we're done */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync int vrc = RTThreadUserSignal (Thread);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync AssertRC (vrc);
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync LogFlowFuncLeave();
79f1ee8626f01a1f80d0235790ab91deba73af88vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync return 0;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync}
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#endif
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync