Changeset 25619 in vbox
- Timestamp:
- Jan 2, 2010 7:50:19 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 56310
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/testcase/tstRTLockValidator.cpp
r25618 r25619 330 330 331 331 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); 332 static 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 382 static 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); 335 388 336 389 RTTEST_CHECK_RETV(g_hTest, RT_ELEMENTS(g_ahThreads) >= cThreads); … … 356 409 g_cLoops = 0; 357 410 g_cDeadlocks = 0; 358 g_NanoTSStop = c NanoSecs ? RTTimeNanoTS() + cNanoSecs: 0;411 g_NanoTSStop = cSecs ? RTTimeNanoTS() + cSecs * UINT64_C(1000000000) : 0; 359 412 360 413 int rc = testStartThreads(cThreads, pfnThread); 361 414 if (RT_SUCCESS(rc)) 362 testWaitForThreads(30*1000 + c NanoSecs / 1000000, true);363 364 RTTEST_CHECK(g_hTest, !c NanoSecs || g_cLoops > 0);415 testWaitForThreads(30*1000 + cSecs*1000, true); 416 417 RTTEST_CHECK(g_hTest, !cSecs || g_cLoops > 0); 365 418 cLoops += g_cLoops; 366 RTTEST_CHECK(g_hTest, !c NanoSecs || g_cDeadlocks > 0);419 RTTEST_CHECK(g_hTest, !cSecs || g_cDeadlocks > 0); 367 420 cDeadlocks += g_cDeadlocks; 368 421 } … … 375 428 testWaitForThreads(10*1000, false); 376 429 377 if (c NanoSecs)430 if (cSecs) 378 431 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "cLoops=%u cDeadlocks=%u (%u%%)\n", 379 432 cLoops, cDeadlocks, cLoops ? cDeadlocks * 100 / cLoops : 0); … … 393 446 394 447 395 static void test3(uint32_t cThreads, uint32_t cPasses, uint64_t cNanoSecs) 396 { 397 testIt(cThreads, cPasses, cNanoSecs, test3Thread, "read-write race"); 448 static void test3(uint32_t cThreads, uint32_t cPasses, uint32_t cSecs) 449 { 450 testIt(cThreads, cPasses, cSecs, test3Thread, "read-write race"); 451 } 452 453 454 static void test4(uint32_t cThreads, uint32_t cPasses, uint32_t cSecs) 455 { 456 testIt(cThreads, cPasses, cSecs, test4Thread, "read-write race v2"); 398 457 } 399 458 … … 453 512 */ 454 513 RTLockValidatorSetQuiet(true); 455 #if 0 514 456 515 test1( 2, 1024); 457 516 test1( 3, 1024); … … 468 527 test2(15, 512); 469 528 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); 474 537 475 538 return RTTestSummaryAndDestroy(g_hTest);
Note:
See TracChangeset
for help on using the changeset viewer.