summaryrefslogtreecommitdiff
path: root/src/VBox/Main/src-server/VirtualBoxImpl.cpp
diff options
context:
space:
mode:
authorFelix Geyer <debfx-pkg@fobos.de>2011-10-17 14:18:31 +0200
committerFelix Geyer <debfx-pkg@fobos.de>2011-10-17 14:18:31 +0200
commit1cf00a61132b69bc7e27254fdd74bf105d2da28c (patch)
treea7d314cc5ec77b4ce3e1f037af600b53ae1d43f8 /src/VBox/Main/src-server/VirtualBoxImpl.cpp
parentf8fd93b0b6b13ba94584bb61c1efd1a761f438c9 (diff)
downloadvirtualbox-1cf00a61132b69bc7e27254fdd74bf105d2da28c.tar.gz
Imported Upstream version 4.1.4-dfsgupstream/4.1.4-dfsg
Diffstat (limited to 'src/VBox/Main/src-server/VirtualBoxImpl.cpp')
-rw-r--r--src/VBox/Main/src-server/VirtualBoxImpl.cpp40
1 files changed, 27 insertions, 13 deletions
diff --git a/src/VBox/Main/src-server/VirtualBoxImpl.cpp b/src/VBox/Main/src-server/VirtualBoxImpl.cpp
index 6af42a0e5..43207ef5f 100644
--- a/src/VBox/Main/src-server/VirtualBoxImpl.cpp
+++ b/src/VBox/Main/src-server/VirtualBoxImpl.cpp
@@ -1,4 +1,4 @@
-/* $Id: VirtualBoxImpl.cpp 38211 2011-07-28 09:26:31Z vboxsync $ */
+/* $Id: VirtualBoxImpl.cpp $ */
/** @file
* Implementation of IVirtualBox in VBoxSVC.
@@ -3931,30 +3931,38 @@ HRESULT VirtualBox::saveRegistries(const GuidList &llRegistriesThatNeedSaving)
}
/**
- * Creates the path to the specified file according to the path information
- * present in the file name.
+ * Checks if the path to the specified file exists, according to the path
+ * information present in the file name. Optionally the path is created.
*
* Note that the given file name must contain the full path otherwise the
* extracted relative path will be created based on the current working
* directory which is normally unknown.
*
- * @param aFileName Full file name which path needs to be created.
+ * @param aFileName Full file name which path is checked/created.
+ * @param aCreate Flag if the path should be created if it doesn't exist.
*
- * @return Extended error information on failure to create the path.
+ * @return Extended error information on failure to check/create the path.
*/
/* static */
-HRESULT VirtualBox::ensureFilePathExists(const Utf8Str &strFileName)
+HRESULT VirtualBox::ensureFilePathExists(const Utf8Str &strFileName, bool fCreate)
{
Utf8Str strDir(strFileName);
strDir.stripFilename();
if (!RTDirExists(strDir.c_str()))
{
- int vrc = RTDirCreateFullPath(strDir.c_str(), 0777);
- if (RT_FAILURE(vrc))
- return setErrorStatic(E_FAIL,
- Utf8StrFmt(tr("Could not create the directory '%s' (%Rrc)"),
- strDir.c_str(),
- vrc));
+ if (fCreate)
+ {
+ int vrc = RTDirCreateFullPath(strDir.c_str(), 0777);
+ if (RT_FAILURE(vrc))
+ return setErrorStatic(VBOX_E_IPRT_ERROR,
+ Utf8StrFmt(tr("Could not create the directory '%s' (%Rrc)"),
+ strDir.c_str(),
+ vrc));
+ }
+ else
+ return setErrorStatic(VBOX_E_IPRT_ERROR,
+ Utf8StrFmt(tr("Directory '%s' does not exist"),
+ strDir.c_str()));
}
return S_OK;
@@ -4538,7 +4546,13 @@ DECLCALLBACK(int) VirtualBox::AsyncEventHandler(RTTHREAD thread, void *pvUser)
// signal that we're ready
RTThreadUserSignal(thread);
- while (RT_SUCCESS(eventQ->processEventQueue(RT_INDEFINITE_WAIT)))
+ /*
+ * In case of spurious wakeups causing VERR_TIMEOUTs and/or other return codes
+ * we must not stop processing events and delete the "eventQ" object. This must
+ * be done ONLY when we stop this loop via interruptEventQueueProcessing().
+ * See #5724.
+ */
+ while (eventQ->processEventQueue(RT_INDEFINITE_WAIT) != VERR_INTERRUPTED)
/* nothing */ ;
delete eventQ;