diff options
Diffstat (limited to 'src/VBox/Main/src-server/MachineImpl.cpp')
-rw-r--r-- | src/VBox/Main/src-server/MachineImpl.cpp | 90 |
1 files changed, 53 insertions, 37 deletions
diff --git a/src/VBox/Main/src-server/MachineImpl.cpp b/src/VBox/Main/src-server/MachineImpl.cpp index b8eea6f14..d79059174 100644 --- a/src/VBox/Main/src-server/MachineImpl.cpp +++ b/src/VBox/Main/src-server/MachineImpl.cpp @@ -12858,28 +12858,6 @@ HRESULT SessionMachine::init(Machine *aMachine) { unconst(mNetworkAdapters[slot]).createObject(); mNetworkAdapters[slot]->init(this, aMachine->mNetworkAdapters[slot]); - - NetworkAttachmentType_T type; - HRESULT hrc; - hrc = mNetworkAdapters[slot]->COMGETTER(AttachmentType)(&type); - if ( SUCCEEDED(hrc) - && type == NetworkAttachmentType_NATNetwork) - { - Bstr name; - hrc = mNetworkAdapters[slot]->COMGETTER(NATNetwork)(name.asOutParam()); - if (SUCCEEDED(hrc)) - { - LogRel(("VM '%s' starts using NAT network '%ls'\n", - mUserData->s.strName.c_str(), name.raw())); - aMachine->lockHandle()->unlockWrite(); - mParent->natNetworkRefInc(name.raw()); -#ifdef RT_LOCK_STRICT - aMachine->lockHandle()->lockWrite(RT_SRC_POS); -#else - aMachine->lockHandle()->lockWrite(); -#endif - } - } } /* create another bandwidth control object that will be mutable */ @@ -12892,6 +12870,8 @@ HRESULT SessionMachine::init(Machine *aMachine) /* Confirm a successful initialization when it's the case */ autoInitSpan.setSucceeded(); + miNATNetworksStarted = 0; + LogFlowThisFuncLeave(); return rc; } @@ -13071,24 +13051,29 @@ void SessionMachine::uninit(Uninit::Reason aReason) mData->mSession.mRemoteControls.clear(); } - for (ULONG slot = 0; slot < mNetworkAdapters.size(); slot++) + /* Remove all references to the NAT network service. The service will stop + * if all references (also from other VMs) are removed. */ + for (; miNATNetworksStarted > 0; miNATNetworksStarted--) { - NetworkAttachmentType_T type; - HRESULT hrc; - - hrc = mNetworkAdapters[slot]->COMGETTER(AttachmentType)(&type); - if ( SUCCEEDED(hrc) - && type == NetworkAttachmentType_NATNetwork) + for (ULONG slot = 0; slot < mNetworkAdapters.size(); slot++) { - Bstr name; - hrc = mNetworkAdapters[slot]->COMGETTER(NATNetwork)(name.asOutParam()); - if (SUCCEEDED(hrc)) + NetworkAttachmentType_T type; + HRESULT hrc; + + hrc = mNetworkAdapters[slot]->COMGETTER(AttachmentType)(&type); + if ( SUCCEEDED(hrc) + && type == NetworkAttachmentType_NATNetwork) { - multilock.release(); - LogRel(("VM '%s' stops using NAT network '%ls'\n", - mUserData->s.strName.c_str(), name.raw())); - mParent->natNetworkRefDec(name.raw()); - multilock.acquire(); + Bstr name; + hrc = mNetworkAdapters[slot]->COMGETTER(NATNetwork)(name.asOutParam()); + if (SUCCEEDED(hrc)) + { + multilock.release(); + LogRel(("VM '%s' stops using NAT network '%ls'\n", + mUserData->s.strName.c_str(), name.raw())); + mParent->natNetworkRefDec(name.raw()); + multilock.acquire(); + } } } } @@ -13261,6 +13246,37 @@ STDMETHODIMP SessionMachine::BeginPowerUp(IProgress *aProgress) if (!mData->mSession.mProgress.isNull()) mData->mSession.mProgress->setOtherProgressObject(aProgress); + /* If we didn't reference the NAT network service yet, add a reference to + * force a start */ + if (miNATNetworksStarted < 1) + { + for (ULONG slot = 0; slot < mNetworkAdapters.size(); slot++) + { + NetworkAttachmentType_T type; + HRESULT hrc; + hrc = mNetworkAdapters[slot]->COMGETTER(AttachmentType)(&type); + if ( SUCCEEDED(hrc) + && type == NetworkAttachmentType_NATNetwork) + { + Bstr name; + hrc = mNetworkAdapters[slot]->COMGETTER(NATNetwork)(name.asOutParam()); + if (SUCCEEDED(hrc)) + { + LogRel(("VM '%s' starts using NAT network '%ls'\n", + mUserData->s.strName.c_str(), name.raw())); + mPeer->lockHandle()->unlockWrite(); + mParent->natNetworkRefInc(name.raw()); +#ifdef RT_LOCK_STRICT + mPeer->lockHandle()->lockWrite(RT_SRC_POS); +#else + mPeer->lockHandle()->lockWrite(); +#endif + } + } + } + miNATNetworksStarted++; + } + LogFlowThisFunc(("returns S_OK.\n")); return S_OK; } |