VirtualBox

Changeset 25619 in vbox


Ignore:
Timestamp:
Jan 2, 2010 7:50:19 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
56310
Message:

tstRTLockValidator.cpp: Another test variation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/tstRTLockValidator.cpp

    r25618 r25619  
    330330
    331331
    332 static void testIt(uint32_t cThreads, uint32_t cPasses, uint64_t cNanoSecs, PFNRTTHREAD pfnThread, const char *pszName)
    333 {
    334     RTTestSubF(g_hTest, "%s, %u threads, %u passes", pszName, cThreads, cPasses);
     332static DECLCALLBACK(int) test4Thread(RTTHREAD ThreadSelf, void *pvUser)
     333{
     334    uintptr_t       i     = (uintptr_t)pvUser;
     335    RTSEMRW         hMine = g_ahSemRWs[i];
     336    RTSEMRW         hNext = g_ahSemRWs[(i + 1) % g_cThreads];
     337
     338    do
     339    {
     340        int rc1 = (i & 1 ? RTSemRWRequestWrite : RTSemRWRequestRead)(hMine, 60*1000); /* ugly ;-) */
     341        RTTEST_CHECK(g_hTest, RTThreadGetState(RTThreadSelf()) == RTTHREADSTATE_RUNNING);
     342        if (rc1 != VINF_SUCCESS && rc1 != VERR_SEM_LV_DEADLOCK && rc1 != VERR_SEM_LV_ILLEGAL_UPGRADE)
     343        {
     344            RTTestFailed(g_hTest, "#%u: RTSemRWRequest%s(hMine,) -> %Rrc\n", i, i & 1 ? "Write" : "read", rc1);
     345            break;
     346        }
     347        if (RT_SUCCESS(rc1))
     348        {
     349            for (unsigned iInner = 0; iInner < 4; iInner++)
     350            {
     351                int rc2 = RTSemRWRequestWrite(hNext, 60*1000);
     352                if (rc2 != VINF_SUCCESS && rc2 != VERR_SEM_LV_DEADLOCK && rc2 != VERR_SEM_LV_ILLEGAL_UPGRADE)
     353                {
     354                    RTTestFailed(g_hTest, "#%u: RTSemRWRequestWrite -> %Rrc\n", i, rc2);
     355                    break;
     356                }
     357                if (RT_SUCCESS(rc2))
     358                {
     359                    RTTEST_CHECK_RC(g_hTest, rc2 = RTSemRWReleaseWrite(hNext), VINF_SUCCESS);
     360                    if (RT_FAILURE(rc2))
     361                        break;
     362                }
     363                else
     364                    ASMAtomicIncU32(&g_cDeadlocks);
     365                ASMAtomicIncU32(&g_cLoops);
     366            }
     367
     368            RTTEST_CHECK_RC(g_hTest, rc1 = (i & 1 ? RTSemRWReleaseWrite : RTSemRWReleaseRead)(hMine), VINF_SUCCESS);
     369            RTTEST_CHECK(g_hTest, RTThreadGetState(RTThreadSelf()) == RTTHREADSTATE_RUNNING);
     370            if (RT_FAILURE(rc1))
     371                break;
     372        }
     373        else
     374            ASMAtomicIncU32(&g_cDeadlocks);
     375        ASMAtomicIncU32(&g_cLoops);
     376    } while (RTTimeNanoTS() < g_NanoTSStop);
     377
     378    return VINF_SUCCESS;
     379}
     380
     381
     382static void testIt(uint32_t cThreads, uint32_t cPasses, uint32_t cSecs, PFNRTTHREAD pfnThread, const char *pszName)
     383{
     384    if (cSecs)
     385        RTTestSubF(g_hTest, "%s, %u threads, %u secs", pszName, cThreads, cSecs * cPasses);
     386    else
     387        RTTestSubF(g_hTest, "%s, %u threads, %u passes", pszName, cThreads, cPasses);
    335388
    336389    RTTEST_CHECK_RETV(g_hTest, RT_ELEMENTS(g_ahThreads) >= cThreads);
     
    356409        g_cLoops = 0;
    357410        g_cDeadlocks = 0;
    358         g_NanoTSStop = cNanoSecs ? RTTimeNanoTS() + cNanoSecs : 0;
     411        g_NanoTSStop = cSecs ? RTTimeNanoTS() + cSecs * UINT64_C(1000000000) : 0;
    359412
    360413        int rc = testStartThreads(cThreads, pfnThread);
    361414        if (RT_SUCCESS(rc))
    362             testWaitForThreads(30*1000 + cNanoSecs / 1000000, true);
    363 
    364         RTTEST_CHECK(g_hTest, !cNanoSecs || g_cLoops > 0);
     415            testWaitForThreads(30*1000 + cSecs*1000, true);
     416
     417        RTTEST_CHECK(g_hTest, !cSecs || g_cLoops > 0);
    365418        cLoops += g_cLoops;
    366         RTTEST_CHECK(g_hTest, !cNanoSecs || g_cDeadlocks > 0);
     419        RTTEST_CHECK(g_hTest, !cSecs || g_cDeadlocks > 0);
    367420        cDeadlocks += g_cDeadlocks;
    368421    }
     
    375428    testWaitForThreads(10*1000, false);
    376429
    377     if (cNanoSecs)
     430    if (cSecs)
    378431        RTTestPrintf(g_hTest,  RTTESTLVL_ALWAYS, "cLoops=%u cDeadlocks=%u (%u%%)\n",
    379432                     cLoops, cDeadlocks, cLoops ? cDeadlocks * 100 / cLoops : 0);
     
    393446
    394447
    395 static void test3(uint32_t cThreads, uint32_t cPasses, uint64_t cNanoSecs)
    396 {
    397     testIt(cThreads, cPasses, cNanoSecs, test3Thread, "read-write race");
     448static void test3(uint32_t cThreads, uint32_t cPasses, uint32_t cSecs)
     449{
     450    testIt(cThreads, cPasses, cSecs, test3Thread, "read-write race");
     451}
     452
     453
     454static void test4(uint32_t cThreads, uint32_t cPasses, uint32_t cSecs)
     455{
     456    testIt(cThreads, cPasses, cSecs, test4Thread, "read-write race v2");
    398457}
    399458
     
    453512     */
    454513    RTLockValidatorSetQuiet(true);
    455 #if 0
     514
    456515    test1( 2, 1024);
    457516    test1( 3, 1024);
     
    468527    test2(15,  512);
    469528    test2(30,  384);
    470 #endif
    471 
    472     test3( 2,  2,  5*UINT64_C(1000000000));
    473     test3(10,  1,  5*UINT64_C(1000000000));
     529
     530    test3( 2,  1,  2);
     531    test3(10,  1,  2);
     532
     533    test4( 2,  1,  2);
     534    test4( 6,  1,  2);
     535    test4(10,  1, 10);
     536    test4(30,  1, 10);
    474537
    475538    return RTTestSummaryAndDestroy(g_hTest);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette