diff options
author | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2010-04-19 14:59:33 +0000 |
---|---|---|
committer | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2010-04-19 14:59:33 +0000 |
commit | 2c52b72487f69aeba88ce8dd3e6809bca6fba6f9 (patch) | |
tree | 458b6b26740e8212f53ed726b2c5d3d0a0ad69d8 /src/VBox/Runtime/testcase/tstRTR0SemMutex.cpp | |
parent | 0a2b4dddb0b73b9a8eba732adaecfe2e4bd39211 (diff) | |
download | VirtualBox-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.cpp | 106 |
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; |