Changeset 19953 in vbox for trunk/src/VBox/Runtime/testcase
- Timestamp:
- May 23, 2009 11:59:06 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 47655
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/testcase/tstCritSect.cpp
r14831 r19953 5 5 6 6 /* 7 * Copyright (C) 2006-200 7Sun Microsystems, Inc.7 * Copyright (C) 2006-2009 Sun Microsystems, Inc. 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 29 29 */ 30 30 31 32 31 /******************************************************************************* 33 32 * Header Files * … … 37 36 #endif 38 37 #include <iprt/critsect.h> 38 39 #include <iprt/asm.h> 40 #include <iprt/assert.h> 41 #include <iprt/ctype.h> 42 #include <iprt/err.h> 43 #include <iprt/initterm.h> 44 #include <iprt/getopt.h> 39 45 #include <iprt/lock.h> 46 #include <iprt/log.h> 47 #include <iprt/mem.h> 48 #include <iprt/semaphore.h> 49 #include <iprt/string.h> 50 #include <iprt/test.h> 51 #include <iprt/time.h> 40 52 #include <iprt/thread.h> 41 #include <iprt/log.h> 42 #include <iprt/semaphore.h> 43 #include <iprt/asm.h> 44 #include <iprt/initterm.h> 45 #include <iprt/time.h> 46 #include <iprt/assert.h> 47 #include <iprt/string.h> 48 #include <iprt/err.h> 49 50 #include <stdio.h> 51 #include <stdlib.h> 53 52 54 53 55 #ifndef TRY_WIN32_CRIT 54 #define LOCKERS(sect) ((sect).cLockers) 55 #else 56 # define LOCKERS(sect) ((sect).cLockers) 57 #else /* TRY_WIN32_CRIT */ 58 56 59 /* This is for comparing with the "real thing". */ 57 60 #define RTCRITSECT CRITICAL_SECTION … … 59 62 #define LOCKERS(sect) (*(LONG volatile *)&(sect).LockCount) 60 63 61 inline intRTCritSectInit(PCRITICAL_SECTION pCritSect)64 DECLINLINE(int) RTCritSectInit(PCRITICAL_SECTION pCritSect) 62 65 { 63 66 InitializeCriticalSection(pCritSect); … … 66 69 67 70 #undef RTCritSectEnter 68 inline intRTCritSectEnter(PCRITICAL_SECTION pCritSect)71 DECLINLINE(int) RTCritSectEnter(PCRITICAL_SECTION pCritSect) 69 72 { 70 73 EnterCriticalSection(pCritSect); … … 72 75 } 73 76 74 inline intRTCritSectLeave(PCRITICAL_SECTION pCritSect)77 DECLINLINE(int) RTCritSectLeave(PCRITICAL_SECTION pCritSect) 75 78 { 76 79 LeaveCriticalSection(pCritSect); … … 78 81 } 79 82 80 inline intRTCritSectDelete(PCRITICAL_SECTION pCritSect)83 DECLINLINE(int) RTCritSectDelete(PCRITICAL_SECTION pCritSect) 81 84 { 82 85 DeleteCriticalSection(pCritSect); 83 86 return VINF_SUCCESS; 84 87 } 85 #endif 88 89 #endif /* TRY_WIN32_CRIT */ 90 86 91 87 92 /******************************************************************************* … … 139 144 * Global Variables * 140 145 *******************************************************************************/ 141 /** Error counter. */ 142 static volatile uint32_t g_cErrors = 0; 146 /** The test handle. */ 147 static RTTEST g_hTest; 148 149 143 150 144 151 /** 145 152 * Thread which goes to sleep on the critsect and checks that it's released in the right order. 146 153 */ 147 static DECLCALLBACK(int) ThreadTest1(RTTHREAD ThreadSelf, void *pvArg) 148 { 149 PTHREADTEST1ARGS pArgs = (PTHREADTEST1ARGS)pvArg; 150 Log2(("ThreadTest1: Start - iThread=%d ThreadSelf=%p\n", pArgs->iThread, ThreadSelf)); 154 static DECLCALLBACK(int) ThreadTest1(RTTHREAD ThreadSelf, void *pvArgs) 155 { 156 THREADTEST1ARGS Args = *(PTHREADTEST1ARGS)pvArgs; 157 Log2(("ThreadTest1: Start - iThread=%d ThreadSelf=%p\n", Args.iThread, ThreadSelf)); 158 RTMemFree(pvArgs); 151 159 152 160 /* 153 161 * Enter it. 154 162 */ 155 int rc = RTCritSectEnter( pArgs->pCritSect);163 int rc = RTCritSectEnter(Args.pCritSect); 156 164 if (RT_FAILURE(rc)) 157 165 { 158 printf("tstCritSect: FATAL FAILURE - thread %d: RTCritSectEnter -> %d\n", pArgs->iThread, rc); 159 ASMAtomicIncU32(&g_cErrors); 160 exit(g_cErrors); 166 RTTestFailed(g_hTest, "thread %d: RTCritSectEnter -> %Rrc", Args.iThread, rc); 161 167 return 1; 162 168 } … … 165 171 * Check release order. 166 172 */ 167 if (*pArgs->pu32Release != pArgs->iThread) 168 { 169 printf("tstCritSect: FAILURE - thread %d: released as number %d\n", pArgs->iThread, *pArgs->pu32Release); 170 ASMAtomicIncU32(&g_cErrors); 171 } 172 ASMAtomicIncU32(pArgs->pu32Release); 173 if (*Args.pu32Release != Args.iThread) 174 RTTestFailed(g_hTest, "thread %d: released as number %d", Args.iThread, *Args.pu32Release); 175 ASMAtomicIncU32(Args.pu32Release); 173 176 174 177 /* 175 178 * Leave it. 176 179 */ 177 rc = RTCritSectLeave( pArgs->pCritSect);180 rc = RTCritSectLeave(Args.pCritSect); 178 181 if (RT_FAILURE(rc)) 179 182 { 180 printf("tstCritSect: FATAL FAILURE - thread %d: RTCritSectEnter -> %d\n", pArgs->iThread, rc); 181 ASMAtomicIncU32(&g_cErrors); 182 exit(g_cErrors); 183 RTTestFailed(g_hTest, "thread %d: RTCritSectEnter -> %Rrc", Args.iThread, rc); 183 184 return 1; 184 185 } 185 186 186 Log2(("ThreadTest1: End - iThread=%d ThreadSelf=%p\n", pArgs->iThread, ThreadSelf));187 Log2(("ThreadTest1: End - iThread=%d ThreadSelf=%p\n", Args.iThread, ThreadSelf)); 187 188 return 0; 188 189 } 189 190 190 191 191 int Test1(unsigned cThreads) 192 { 192 static int Test1(unsigned cThreads) 193 { 194 RTTestSubF(g_hTest, "Test #1 with %u thread", cThreads); 195 193 196 /* 194 197 * Create a critical section. 195 198 */ 196 199 RTCRITSECT CritSect; 197 int rc = RTCritSectInit(&CritSect); 198 if (RT_FAILURE(rc)) 199 { 200 printf("tstCritSect: FATAL FAILURE - RTCritSectInit -> %d\n", rc); 201 return 1; 202 } 200 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectInit(&CritSect), VINF_SUCCESS, 1); 203 201 204 202 /* 205 203 * Enter, leave and enter again. 206 204 */ 207 rc = RTCritSectEnter(&CritSect); 208 if (RT_FAILURE(rc)) 209 { 210 printf("tstCritSect: FATAL FAILURE - RTCritSectEnter -> %d\n", rc); 211 return 1; 212 } 213 rc = RTCritSectLeave(&CritSect); 214 if (RT_FAILURE(rc)) 215 { 216 printf("tstCritSect: FATAL FAILURE - RTCritSectLeave -> %d\n", rc); 217 return 1; 218 } 219 rc = RTCritSectEnter(&CritSect); 220 if (RT_FAILURE(rc)) 221 { 222 printf("tstCritSect: FATAL FAILURE - RTCritSectEnter -> %d (2nd)\n", rc); 223 return 1; 224 } 205 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectEnter(&CritSect), VINF_SUCCESS, 1); 206 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectLeave(&CritSect), VINF_SUCCESS, 1); 207 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectEnter(&CritSect), VINF_SUCCESS, 1); 225 208 226 209 /* … … 230 213 for (uint32_t iThread = 0; iThread < cThreads; iThread++) 231 214 { 232 PTHREADTEST1ARGS pArgs = (PTHREADTEST1ARGS) calloc(sizeof(*pArgs), 1);215 PTHREADTEST1ARGS pArgs = (PTHREADTEST1ARGS)RTMemAllocZ(sizeof(*pArgs)); 233 216 pArgs->iThread = iThread; 234 217 pArgs->pCritSect = &CritSect; 235 218 pArgs->pu32Release = &u32Release; 236 219 int32_t iLock = LOCKERS(CritSect); 237 char szThread[17]; 238 RTStrPrintf(szThread, sizeof(szThread), "T%d", iThread); 239 RTTHREAD Thread; 240 rc = RTThreadCreate(&Thread, ThreadTest1, pArgs, 0, RTTHREADTYPE_DEFAULT, 0, szThread); 241 if (RT_FAILURE(rc)) 242 { 243 printf("tstCritSect: FATAL FAILURE - RTThreadCreate -> %d\n", rc); 244 exit(1); 245 } 220 RTTHREAD Thread; 221 RTTEST_CHECK_RC_RET(g_hTest, RTThreadCreateF(&Thread, ThreadTest1, pArgs, 0, RTTHREADTYPE_DEFAULT, 0, "T%d", iThread), VINF_SUCCESS, 1); 222 246 223 /* wait for it to get into waiting. */ 247 224 while (LOCKERS(CritSect) == iLock) … … 254 231 */ 255 232 u32Release = 0; 256 rc = RTCritSectLeave(&CritSect); 257 if (RT_FAILURE(rc)) 258 { 259 printf("tstCritSect: FATAL FAILURE - RTCritSectLeave -> %d (2nd)\n", rc); 260 return 1; 261 } 233 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectLeave(&CritSect), VINF_SUCCESS, 1); 262 234 while (u32Release < cThreads) 263 235 RTThreadSleep(10); 264 236 265 rc = RTCritSectDelete(&CritSect); 266 if (RT_FAILURE(rc)) 267 { 268 printf("tstCritSect: FAILURE - RTCritSectDelete -> %d\n", rc); 269 ASMAtomicIncU32(&g_cErrors); 270 } 271 237 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectDelete(&CritSect), VINF_SUCCESS, 1); 272 238 return 0; 273 239 } … … 295 261 if (RT_FAILURE(rc)) 296 262 { 297 printf("tstCritSect: FATAL FAILURE - Test 2 - thread %d, iteration %d: RTCritSectEnter -> %d\n", pArgs->iThread, i, rc); 298 ASMAtomicIncU32(&g_cErrors); 299 exit(g_cErrors); 263 RTTestFailed(g_hTest, "thread %d, iteration %d: RTCritSectEnter -> %d", pArgs->iThread, i, rc); 300 264 return 1; 301 265 } … … 303 267 u64TSStart = RTTimeNanoTS(); 304 268 305 269 #if 0 /* We just check for sequences. */ 306 270 /* 307 271 * Check release order. 308 272 */ 309 273 if ((*pArgs->pu32Release % pArgs->cThreads) != pArgs->iThread) 310 { 311 printf("tstCritSect: FAILURE - Test 2 - thread %d, iteration %d: released as number %d (%d)\n", 312 pArgs->iThread, i, *pArgs->pu32Release % pArgs->cThreads, *pArgs->pu32Release); 313 ASMAtomicIncU32(&g_cErrors); 314 } 274 RTTestFailed(g_hTest, "thread %d, iteration %d: released as number %d (%d)", 275 pArgs->iThread, i, *pArgs->pu32Release % pArgs->cThreads, *pArgs->pu32Release); 315 276 else 316 printf("tstCritSect: SUCCESS - Test 2 - thread %d,iteration %d: released as number %d (%d)\n",317 pArgs->iThread, i, *pArgs->pu32Release % pArgs->cThreads, *pArgs->pu32Release);318 277 RTTestPrintf(g_hTest, RTTESTLVL_INFO, "iteration %d: released as number %d (%d)\n", 278 pArgs->iThread, i, *pArgs->pu32Release % pArgs->cThreads, *pArgs->pu32Release); 279 #endif 319 280 pArgs->cTimes++; 320 281 ASMAtomicIncU32(pArgs->pu32Release); … … 348 309 if (*pArgs->pu32Alone != ~0U) 349 310 { 350 printf("tstCritSect: FATAL FAILURE - Test 2 - thread %d, iteration %d: not alone!!!\n", pArgs->iThread, i); 351 AssertReleaseMsgFailed(("Not alone!\n")); 352 ASMAtomicIncU32(&g_cErrors); 353 exit(g_cErrors); 311 RTTestFailed(g_hTest, "thread %d, iteration %d: not alone!!!", pArgs->iThread, i); 312 //AssertReleaseMsgFailed(("Not alone!\n")); 354 313 return 1; 355 314 } … … 360 319 if (*pArgs->pu32Alone != pArgs->iThread) 361 320 { 362 printf("tstCritSect: FATAL FAILURE - Test 2 - thread %d, iteration %d: not alone!!!\n", pArgs->iThread, i); 363 AssertReleaseMsgFailed(("Not alone!\n")); 364 ASMAtomicIncU32(&g_cErrors); 365 exit(g_cErrors); 321 RTTestFailed(g_hTest, "thread %d, iteration %d: not alone!!!", pArgs->iThread, i); 322 //AssertReleaseMsgFailed(("Not alone!\n")); 366 323 return 1; 367 324 } … … 384 341 if (RT_FAILURE(rc)) 385 342 { 386 printf("tstCritSect: FATAL FAILURE - Test 2 - thread %d, iteration %d: RTCritSectEnter -> %d\n", pArgs->iThread, i, rc); 387 ASMAtomicIncU32(&g_cErrors); 388 exit(g_cErrors); 343 RTTestFailed(g_hTest, "thread %d, iteration %d: RTCritSectEnter -> %d", pArgs->iThread, i, rc); 389 344 return 1; 390 345 } … … 398 353 } 399 354 400 int Test2(unsigned cThreads, unsigned cIterations, unsigned cCheckLoops)401 { 402 printf("tstCritSect: Test2 - cThread=%d cIterations=%d cCheckLoops=%d...\n", cThreads, cIterations, cCheckLoops);355 static int Test2(unsigned cThreads, unsigned cIterations, unsigned cCheckLoops) 356 { 357 RTTestSubF(g_hTest, "Test #2 - cThreads=%u cIterations=%u cCheckLoops=%u", cThreads, cIterations, cCheckLoops); 403 358 404 359 /* … … 406 361 */ 407 362 RTCRITSECT CritSect; 408 int rc = RTCritSectInit(&CritSect); 409 if (RT_FAILURE(rc)) 410 { 411 printf("tstCritSect: FATAL FAILURE - Test 2 - RTCritSectInit -> %d\n", rc); 412 return 1; 413 } 363 int rc; 364 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectInit(&CritSect), VINF_SUCCESS, 1); 414 365 415 366 /* 416 367 * Enter, leave and enter again. 417 368 */ 418 rc = RTCritSectEnter(&CritSect); 419 if (RT_FAILURE(rc)) 420 { 421 printf("tstCritSect: FATAL FAILURE - Test 2 - RTCritSectEnter -> %d\n", rc); 422 return 1; 423 } 424 rc = RTCritSectLeave(&CritSect); 425 if (RT_FAILURE(rc)) 426 { 427 printf("tstCritSect: FATAL FAILURE - Test 2 - RTCritSectLeave -> %d\n", rc); 428 return 1; 429 } 430 rc = RTCritSectEnter(&CritSect); 431 if (RT_FAILURE(rc)) 432 { 433 printf("tstCritSect: FATAL FAILURE - Test 2 - RTCritSectEnter -> %d (2nd)\n", rc); 434 return 1; 435 } 369 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectEnter(&CritSect), VINF_SUCCESS, 1); 370 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectLeave(&CritSect), VINF_SUCCESS, 1); 371 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectEnter(&CritSect), VINF_SUCCESS, 1); 436 372 437 373 /* 438 374 * Now spawn threads which will go to sleep entering the critsect. 439 375 */ 440 PTHREADTEST2ARGS paArgs = (PTHREADTEST2ARGS) calloc(sizeof(THREADTEST2ARGS),cThreads);441 RTSEMEVENT EventDone;442 rc = RTSemEventCreate(&EventDone);376 PTHREADTEST2ARGS paArgs = (PTHREADTEST2ARGS)RTMemAllocZ(sizeof(THREADTEST2ARGS) * cThreads); 377 RTSEMEVENT EventDone; 378 RTTEST_CHECK_RC_RET(g_hTest, RTSemEventCreate(&EventDone), VINF_SUCCESS, 1); 443 379 uint32_t volatile u32Release = 0; 444 380 uint32_t volatile u32Alone = ~0; … … 470 406 if (RT_FAILURE(rc)) 471 407 { 472 printf("tstCritSect: FATAL FAILURE - Test 2 - RTThreadCreate -> %d\n", rc);473 exit(1);408 RTTestFailed(g_hTest, "RTThreadCreate -> %d", rc); 409 return 1; 474 410 } 475 411 /* wait for it to get into waiting. */ … … 478 414 RTThreadSleep(20); 479 415 } 480 printf("tstCritSect: Test2 -threads created...\n");416 RTTestPrintf(g_hTest, RTTESTLVL_INFO, "threads created...\n"); 481 417 482 418 /* … … 485 421 u32Release = 0; 486 422 uint64_t u64TSStart = RTTimeNanoTS(); 487 rc = RTCritSectLeave(&CritSect); 488 if (RT_FAILURE(rc)) 489 { 490 printf("tstCritSect: FATAL FAILURE - RTCritSectLeave -> %d (2nd)\n", rc); 491 return 1; 492 } 423 RTTEST_CHECK_RC_RET(g_hTest, RTCritSectLeave(&CritSect), VINF_SUCCESS, 1); 493 424 494 425 while (cThreadRunning > 0) … … 499 430 * Clean up and report results. 500 431 */ 501 rc = RTCritSectDelete(&CritSect); 502 if (RT_FAILURE(rc)) 503 { 504 printf("tstCritSect: FAILURE - RTCritSectDelete -> %d\n", rc); 505 ASMAtomicIncU32(&g_cErrors); 506 } 432 RTTEST_CHECK_RC(g_hTest, RTCritSectDelete(&CritSect), VINF_SUCCESS); 507 433 508 434 /* sequences */ 509 435 if (cSeq > RT_MAX(u32Release / 10000, 1)) 510 { 511 printf("tstCritSect: FAILURE - too many same thread sequences! cSeq=%d\n", cSeq); 512 ASMAtomicIncU32(&g_cErrors); 513 } 436 RTTestFailed(g_hTest, "too many same thread sequences! cSeq=%d\n", cSeq); 514 437 515 438 /* distribution caused by sequences / reordering. */ … … 520 443 int cDiff = paArgs[iThread].cTimes - u32Perfect; 521 444 if ((unsigned)RT_ABS(cDiff) > RT_MAX(u32Perfect / 10000, 2)) 522 { 523 printf("tstCritSect: FAILURE - bad distribution thread %d u32Perfect=%d cTimes=%d cDiff=%d\n", 524 iThread, u32Perfect, paArgs[iThread].cTimes, cDiff); 525 ASMAtomicIncU32(&g_cErrors); 526 } 445 RTTestFailed(g_hTest, "bad distribution thread %d u32Perfect=%d cTimes=%d cDiff=%d\n", 446 iThread, u32Perfect, paArgs[iThread].cTimes, cDiff); 527 447 cDiffTotal += RT_ABS(cDiff); 528 448 } 529 449 530 450 uint32_t cMillies = (uint32_t)((u64TSEnd - u64TSStart) / 1000000); 531 printf("tstCritSect: Test2 - DONE. %d enter+leave in %dms cSeq=%d cReordered=%d cDiffTotal=%d\n", 532 u32Release, cMillies, cSeq, cReordered, cDiffTotal); 451 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, 452 "%d enter+leave in %dms cSeq=%d cReordered=%d cDiffTotal=%d\n", 453 u32Release, cMillies, cSeq, cReordered, cDiffTotal); 533 454 return 0; 534 455 } 535 456 536 457 537 int main(int argc, char *argv[]) 538 { 539 printf("tstCritSect: TESTING\n"); 540 458 int main(int argc, char **argv) 459 { 541 460 int rc = RTR3Init(); 542 461 if (RT_FAILURE(rc)) 543 {544 printf("tstCritSect: FATAL FAILURE - RTR3Init -> %d\n", rc);545 462 return 1; 546 } 547 548 printf("tstCritSect: Test1...\n"); 549 if (Test1(1)) 463 RTTEST hTest; 464 #ifndef TRY_WIN32_CRT 465 rc = RTTestCreate("tstRTCritSect", &hTest); 466 #else 467 rc = RTTestCreate("tstRTCritSectW32", &hTest); 468 #endif 469 if (RT_FAILURE(rc)) 550 470 return 1; 551 if (Test1(3)) 552 return 1; 553 if (Test1(10)) 554 return 1; 555 if (Test1(63)) 556 return 1; 557 if (Test2(1, 200000, 1000)) 558 return 1; 559 if (Test2(2, 200000, 1000)) 560 return 1; 561 if (Test2(3, 200000, 1000)) 562 return 1; 563 if (Test2(4, 200000, 1000)) 564 return 1; 565 if (Test2(5, 200000, 1000)) 566 return 1; 567 if (Test2(7, 200000, 1000)) 568 return 1; 569 if (Test2(67, 200000, 1000)) 570 return 1; 471 g_hTest = hTest; 472 RTTestBanner(hTest); 473 474 /* parse args. */ 475 static const RTGETOPTDEF s_aOptions[] = 476 { 477 { "--distribution", 'd', RTGETOPT_REQ_NOTHING }, 478 { "--help", 'h', RTGETOPT_REQ_NOTHING } 479 }; 480 481 bool fTestDistribution = false; 482 483 int ch; 484 RTGETOPTUNION ValueUnion; 485 RTGETOPTSTATE GetState; 486 RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, 0); 487 while ((ch = RTGetOpt(&GetState, &ValueUnion))) 488 { 489 switch (ch) 490 { 491 case 'd': 492 fTestDistribution = true; 493 break; 494 495 case 'h': 496 RTTestIPrintf(RTTESTLVL_ALWAYS, "%s [--help|-h] [--distribution|-d]\n", argv[0]); 497 return 1; 498 499 case VINF_GETOPT_NOT_OPTION: 500 RTTestIFailed("%Rrs\n", ch); 501 return RTTestSummaryAndDestroy(hTest); 502 503 default: 504 if (ch > 0) 505 { 506 if (RT_C_IS_GRAPH(ch)) 507 RTTestIFailed("unhandled option: -%c\n", ch); 508 else 509 RTTestIFailed("unhandled option: %i\n", ch); 510 } 511 else if (ch == VERR_GETOPT_UNKNOWN_OPTION) 512 RTTestIFailed("unknown option: %s\n", ValueUnion.psz); 513 else if (ValueUnion.pDef) 514 RTTestIFailed("%s: %Rrs\n", ValueUnion.pDef->pszLong, ch); 515 else 516 RTTestIFailed("%Rrs\n", ch); 517 return RTTestSummaryAndDestroy(hTest); 518 } 519 } 520 521 522 /* 523 * Perform the testing. 524 */ 525 if ( !Test1(1) 526 && !Test1(3) 527 && !Test1(10) 528 && !Test1(63)) 529 { 530 531 if ( fTestDistribution 532 && !Test2(1, 200000, 1000) 533 && !Test2(2, 200000, 1000) 534 && !Test2(3, 200000, 1000) 535 && !Test2(4, 200000, 1000) 536 && !Test2(5, 200000, 1000) 537 && !Test2(7, 200000, 1000) 538 && !Test2(67, 200000, 1000)) 539 { 540 /*nothing*/; 541 } 542 } 571 543 572 544 /* 573 545 * Summary. 574 546 */ 575 if (!g_cErrors) 576 printf("tstCritSect: SUCCESS\n"); 577 else 578 printf("tstCritSect: FAILURE - %d errors\n", g_cErrors); 579 580 return !!g_cErrors; 581 } 547 return RTTestSummaryAndDestroy(hTest); 548 } 549
Note:
See TracChangeset
for help on using the changeset viewer.