summaryrefslogtreecommitdiff
path: root/src/VBox/Main/src-server/MachineImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Main/src-server/MachineImpl.cpp')
-rw-r--r--src/VBox/Main/src-server/MachineImpl.cpp90
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;
}