summaryrefslogtreecommitdiff
path: root/src/VBox/Runtime/testcase/tstRTR0SemMutex.cpp
diff options
context:
space:
mode:
authorvboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2010-04-19 14:59:33 +0000
committervboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2010-04-19 14:59:33 +0000
commit2c52b72487f69aeba88ce8dd3e6809bca6fba6f9 (patch)
tree458b6b26740e8212f53ed726b2c5d3d0a0ad69d8 /src/VBox/Runtime/testcase/tstRTR0SemMutex.cpp
parent0a2b4dddb0b73b9a8eba732adaecfe2e4bd39211 (diff)
downloadVirtualBox-svn-2c52b72487f69aeba88ce8dd3e6809bca6fba6f9.tar.gz
tstRTR0SemMutex: More tests.
git-svn-id: https://www.virtualbox.org/svn/vbox/trunk@28472 cfe28804-0f27-0410-a406-dd0f0b0b656f
Diffstat (limited to 'src/VBox/Runtime/testcase/tstRTR0SemMutex.cpp')
-rw-r--r--src/VBox/Runtime/testcase/tstRTR0SemMutex.cpp106
1 files changed, 100 insertions, 6 deletions
diff --git a/src/VBox/Runtime/testcase/tstRTR0SemMutex.cpp b/src/VBox/Runtime/testcase/tstRTR0SemMutex.cpp
index 797102f89b6..a9e77b351d4 100644
--- a/src/VBox/Runtime/testcase/tstRTR0SemMutex.cpp
+++ b/src/VBox/Runtime/testcase/tstRTR0SemMutex.cpp
@@ -34,12 +34,20 @@
#include <iprt/semaphore.h>
#include <iprt/err.h>
-#include <iprt/time.h>
-#include <iprt/string.h>
#include <VBox/sup.h>
+#include <iprt/string.h>
+#include <iprt/time.h>
+#include <iprt/thread.h>
#include "tstRTR0SemMutex.h"
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/** The mutex used in test #2. */
+static RTSEMMUTEX g_hMtxTest2 = NIL_RTSEMMUTEX;
+
+
/**
* Service request callback function.
@@ -52,8 +60,6 @@
DECLEXPORT(int) TSTRTR0SemMutexSrvReqHandler(PSUPDRVSESSION pSession, uint32_t uOperation,
uint64_t u64Arg, PSUPR0SERVICEREQHDR pReqHdr)
{
- if (u64Arg)
- return VERR_INVALID_PARAMETER;
if (!VALID_PTR(pReqHdr))
return VERR_INVALID_PARAMETER;
char *pszErr = (char *)(pReqHdr + 1);
@@ -73,12 +79,22 @@ DECLEXPORT(int) TSTRTR0SemMutexSrvReqHandler(PSUPDRVSESSION pSession, uint32_t u
break; \
}
+ /*
+ * Set up test timeout (when applicable).
+ */
+ if (u64Arg > 120)
+ {
+ SET_ERROR1("Timeout is too large (max 120): %lld", u64Arg);
+ return VINF_SUCCESS;
+ }
+ uint64_t const StartTS = RTTimeSystemMilliTS();
+ uint32_t const cMsMax = (uint32_t)u64Arg * 1000;
/*
* The big switch.
*/
- RTSEMMUTEX hMtx;
- int rc;
+ RTSEMMUTEX hMtx;
+ int rc;
switch (uOperation)
{
case TSTRTR0SEMMUTEX_SANITY_OK:
@@ -177,6 +193,84 @@ DECLEXPORT(int) TSTRTR0SemMutexSrvReqHandler(PSUPDRVSESSION pSession, uint32_t u
CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexDestroy");
break;
+ case TSTRTR0SEMMUTEX_TEST2_SETUP:
+ case TSTRTR0SEMMUTEX_TEST3_SETUP:
+ case TSTRTR0SEMMUTEX_TEST4_SETUP:
+ rc = RTSemMutexCreate(&g_hMtxTest2);
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexCreate");
+ break;
+
+ case TSTRTR0SEMMUTEX_TEST2_DO:
+ for (unsigned i = 0; i < 200; i++)
+ {
+ if (i & 1)
+ {
+ rc = RTSemMutexRequestNoResume(g_hMtxTest2, RT_INDEFINITE_WAIT);
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexRequestNoResume(,indef_wait)");
+ }
+ else
+ {
+ rc = RTSemMutexRequestNoResume(g_hMtxTest2, 30000);
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexRequestNoResume(,30000)");
+ }
+ RTThreadSleep(1);
+ rc = RTSemMutexRelease(g_hMtxTest2);
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexRelease");
+
+ if ((i % 16) == 15 && RTTimeSystemMilliTS() - StartTS >= cMsMax)
+ break;
+ }
+ break;
+
+
+ case TSTRTR0SEMMUTEX_TEST3_DO:
+ for (unsigned i = 0; i < 1000000; i++)
+ {
+ if (i & 1)
+ {
+ rc = RTSemMutexRequestNoResume(g_hMtxTest2, RT_INDEFINITE_WAIT);
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexRequestNoResume(,indef_wait)");
+ }
+ else
+ {
+ rc = RTSemMutexRequestNoResume(g_hMtxTest2, 30000);
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexRequestNoResume(,30000)");
+ }
+ rc = RTSemMutexRelease(g_hMtxTest2);
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexRelease");
+
+ if ((i % 256) == 255 && RTTimeSystemMilliTS() - StartTS >= cMsMax)
+ break;
+ }
+ break;
+
+ case TSTRTR0SEMMUTEX_TEST4_DO:
+ for (unsigned i = 0; i < 1024; i++)
+ {
+ rc = RTSemMutexRequestNoResume(g_hMtxTest2, (i % 32));
+ if (rc != VERR_TIMEOUT)
+ {
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexRequestNoResume");
+ RTThreadSleep(1000);
+
+ rc = RTSemMutexRelease(g_hMtxTest2);
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexRelease");
+ }
+
+ if (RTTimeSystemMilliTS() - StartTS >= cMsMax)
+ break;
+ }
+ break;
+
+ case TSTRTR0SEMMUTEX_TEST2_CLEANUP:
+ case TSTRTR0SEMMUTEX_TEST3_CLEANUP:
+ case TSTRTR0SEMMUTEX_TEST4_CLEANUP:
+ rc = RTSemMutexDestroy(g_hMtxTest2);
+ CHECK_RC_BREAK(rc, VINF_SUCCESS, "RTSemMutexCreate");
+ g_hMtxTest2 = NIL_RTSEMMUTEX;
+ break;
+
+
default:
SET_ERROR1("Unknown test #%d", uOperation);
break;