- Timestamp:
- Dec 20, 2009 2:43:55 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 56187
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/testcase/tstSemRW.cpp
r20597 r25514 33 33 *******************************************************************************/ 34 34 #include <iprt/semaphore.h> 35 #include <iprt/string.h> 36 #include <iprt/ thread.h>37 #include <iprt/ stream.h>38 #include <iprt/ time.h>35 36 #include <iprt/asm.h> 37 #include <iprt/assert.h> 38 #include <iprt/err.h> 39 39 #include <iprt/initterm.h> 40 40 #include <iprt/rand.h> 41 #include <iprt/asm.h> 42 #include <iprt/assert.h> 41 #include <iprt/string.h> 42 #include <iprt/stream.h> 43 #include <iprt/test.h> 44 #include <iprt/time.h> 45 #include <iprt/thread.h> 43 46 44 47 … … 46 49 * Global Variables * 47 50 *******************************************************************************/ 51 static RTTEST g_hTest; 48 52 static RTSEMRW g_hSemRW = NIL_RTSEMRW; 49 53 static bool volatile g_fTerminate; … … 51 55 static bool g_fQuiet; 52 56 static unsigned g_uWritePercent; 53 static uint32_t volatile g_c bConcurrentWrite;54 static uint32_t volatile g_c bConcurrentRead;57 static uint32_t volatile g_cConcurrentWriters; 58 static uint32_t volatile g_cConcurrentReaders; 55 59 static uint32_t volatile g_cErrors; 56 57 58 int PrintError(const char *pszFormat, ...)59 {60 ASMAtomicIncU32(&g_cErrors);61 62 RTPrintf("tstSemRW: FAILURE - ");63 va_list va;64 va_start(va, pszFormat);65 RTPrintfV(pszFormat, va);66 va_end(va);67 68 return 1;69 }70 60 71 61 … … 95 85 if (RT_FAILURE(rc)) 96 86 { 97 PrintError("%x: RTSemRWRequestWriteNoResume failed with %Rrc\n", rc);87 RTTestFailed(g_hTest, "Write recursion %u on %s failed with rc=%Rrc", i, RTThreadSelfName(), rc); 98 88 break; 99 89 } … … 101 91 if (RT_FAILURE(rc)) 102 92 break; 103 if (ASMAtomicIncU32(&g_cbConcurrentWrite) != 1) 104 { 105 PrintError("g_cbConcurrentWrite=%d after request!\n", g_cbConcurrentWrite); 106 break; 107 } 108 if (g_cbConcurrentRead != 0) 109 { 110 PrintError("g_cbConcurrentRead=%d after request!\n", g_cbConcurrentRead); 93 if (ASMAtomicIncU32(&g_cConcurrentWriters) != 1) 94 { 95 RTTestFailed(g_hTest, "g_cConcurrentWriters=%u on %s after write locking it", 96 g_cConcurrentWriters, RTThreadSelfName()); 97 break; 98 } 99 if (g_cConcurrentReaders != 0) 100 { 101 RTTestFailed(g_hTest, "g_cConcurrentReaders=%u on %s after write locking it", 102 g_cConcurrentReaders, RTThreadSelfName()); 111 103 break; 112 104 } … … 117 109 if (RT_FAILURE(rc)) 118 110 { 119 PrintError("%x: RTSemRWRequestReadNoResume failed with %Rrc\n", rc); 120 break; 121 } 122 ASMAtomicIncU32(&g_cbConcurrentRead); 123 if (g_cbConcurrentWrite != 0) 124 { 125 PrintError("g_cbConcurrentWrite=%d after request!\n", g_cbConcurrentWrite); 111 RTTestFailed(g_hTest, "Read locking on %s failed with rc=%Rrc", RTThreadSelfName(), rc); 112 break; 113 } 114 ASMAtomicIncU32(&g_cConcurrentReaders); 115 if (g_cConcurrentWriters != 0) 116 { 117 RTTestFailed(g_hTest, "g_cConcurrentWriters=%u on %s after read locking it", 118 g_cConcurrentWriters, RTThreadSelfName()); 126 119 break; 127 120 } … … 132 125 if (RT_FAILURE(rc)) 133 126 { 134 PrintError("%x: RTSemRWRequestReadNoResume failed with %Rrc\n", rc);127 RTTestFailed(g_hTest, "Read recursion %u on %s failed with rc=%Rrc", i, RTThreadSelfName(), rc); 135 128 break; 136 129 } … … 156 149 if (RT_FAILURE(rc)) 157 150 { 158 PrintError("%x: RTSemRWReleaseRead failed with %Rrc\n", rc);151 RTTestFailed(g_hTest, "Read release %u on %s failed with rc=%Rrc", i, RTThreadSelfName(), rc); 159 152 break; 160 153 } … … 165 158 if (fWrite) 166 159 { 167 if (ASMAtomicDecU32(&g_cbConcurrentWrite) != 0) 168 { 169 PrintError("g_cbConcurrentWrite=%d before release!\n", g_cbConcurrentWrite); 170 break; 171 } 172 if (g_cbConcurrentRead != 0) 173 { 174 PrintError("g_cbConcurrentRead=%d before release!\n", g_cbConcurrentRead); 160 if (ASMAtomicDecU32(&g_cConcurrentWriters) != 0) 161 { 162 RTTestFailed(g_hTest, "g_cConcurrentWriters=%u on %s before write release", 163 g_cConcurrentWriters, RTThreadSelfName()); 164 break; 165 } 166 if (g_cConcurrentReaders != 0) 167 { 168 RTTestFailed(g_hTest, "g_cConcurrentReaders=%u on %s before write release", 169 g_cConcurrentReaders, RTThreadSelfName()); 175 170 break; 176 171 } … … 180 175 if (RT_FAILURE(rc)) 181 176 { 182 PrintError("%x: RTSemRWReleaseWrite failed with %Rrc\n", rc);177 RTTestFailed(g_hTest, "Write release %u on %s failed with rc=%Rrc", i, RTThreadSelfName(), rc); 183 178 break; 184 179 } … … 187 182 else 188 183 { 189 if (g_cbConcurrentWrite != 0) 190 { 191 PrintError("g_cbConcurrentWrite=%d before release!\n", g_cbConcurrentWrite); 192 break; 193 } 194 ASMAtomicDecU32(&g_cbConcurrentRead); 184 if (g_cConcurrentWriters != 0) 185 { 186 RTTestFailed(g_hTest, "g_cConcurrentWriters=%u on %s before read release", 187 g_cConcurrentWriters, RTThreadSelfName()); 188 break; 189 } 190 ASMAtomicDecU32(&g_cConcurrentReaders); 195 191 rc = RTSemRWReleaseRead(g_hSemRW); 196 192 if (RT_FAILURE(rc)) 197 193 { 198 PrintError("%x: RTSemRWReleaseRead failed with %Rrc\n", rc);194 RTTestFailed(g_hTest, "Read release on %s failed with rc=%Rrc", RTThreadSelfName(), rc); 199 195 break; 200 196 } … … 208 204 } 209 205 if (!g_fQuiet) 210 RT Printf("tstSemRW: Thread %08x exited with %lld\n", ThreadSelf, *pu64);206 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Thread %s exited with %lld\n", RTThreadSelfName(), *pu64); 211 207 return VINF_SUCCESS; 212 208 } 213 209 214 210 215 static int Test1(unsigned cThreads, unsigned cSeconds, unsigned uWritePercent, bool fYield, bool fQuiet)211 static void Test3(unsigned cThreads, unsigned cSeconds, unsigned uWritePercent, bool fYield, bool fQuiet) 216 212 { 217 213 int rc; 218 214 unsigned i; 219 uint64_t g_au64[32]; 220 RTTHREAD aThreads[RT_ELEMENTS(g_au64)]; 221 AssertRelease(cThreads <= RT_ELEMENTS(g_au64)); 215 uint64_t au64[32]; 216 RTTHREAD aThreads[RT_ELEMENTS(au64)]; 217 AssertRelease(cThreads <= RT_ELEMENTS(au64)); 218 219 RTTestSubF(g_hTest, "Test3 - %u threads, %u sec, %u%% writes, %syielding", 220 cThreads, cSeconds, uWritePercent, fYield ? "" : "non-"); 222 221 223 222 /* … … 228 227 g_fTerminate = false; 229 228 g_uWritePercent = uWritePercent; 230 g_cbConcurrentWrite = 0; 231 g_cbConcurrentRead = 0; 232 233 rc = RTSemRWCreate(&g_hSemRW); 234 if (RT_FAILURE(rc)) 235 return PrintError("RTSemRWCreate failed (rc=%Rrc)\n", rc); 229 g_cConcurrentWriters = 0; 230 g_cConcurrentReaders = 0; 231 232 RTTEST_CHECK_RC_RETV(g_hTest, RTSemRWCreate(&g_hSemRW), VINF_SUCCESS); 236 233 237 234 /* 238 235 * Create the threads and let them block on the semrw. 239 236 */ 240 rc = RTSemRWRequestWrite(g_hSemRW, RT_INDEFINITE_WAIT); 241 if (RT_FAILURE(rc)) 242 return PrintError("RTSemRWRequestWrite failed (rc=%Rrc)\n", rc); 237 RTTEST_CHECK_RC_RETV(g_hTest, RTSemRWRequestWrite(g_hSemRW, RT_INDEFINITE_WAIT), VINF_SUCCESS); 243 238 244 239 for (i = 0; i < cThreads; i++) 245 240 { 246 g_au64[i] = 0; 247 rc = RTThreadCreate(&aThreads[i], ThreadTest1, &g_au64[i], 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "test"); 248 if (RT_FAILURE(rc)) 249 return PrintError("RTThreadCreate failed for thread %u (rc=%Rrc)\n", i, rc); 250 } 251 252 if (!fQuiet) 253 RTPrintf("tstSemRW: %zu Threads created. Racing them for %u seconds (%s) ...\n", 254 cThreads, cSeconds, g_fYield ? "yielding" : "no yielding"); 255 241 au64[i] = 0; 242 RTTEST_CHECK_RC_RETV(g_hTest, RTThreadCreateF(&aThreads[i], ThreadTest1, &au64[i], 0, 243 RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, 244 "test-%u", i), VINF_SUCCESS); 245 } 246 247 /* 248 * Do the test run. 249 */ 256 250 uint64_t u64StartTS = RTTimeNanoTS(); 257 rc = RTSemRWReleaseWrite(g_hSemRW); 258 if (RT_FAILURE(rc)) 259 PrintError("RTSemRWReleaseWrite failed (rc=%Rrc)\n", rc); 251 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_hSemRW), VINF_SUCCESS); 260 252 RTThreadSleep(cSeconds * 1000); 261 ASMAtomic XchgBool(&g_fTerminate, true);253 ASMAtomicWriteBool(&g_fTerminate, true); 262 254 uint64_t ElapsedNS = RTTimeNanoTS() - u64StartTS; 263 255 256 /* 257 * Clean up the threads and semaphore. 258 */ 264 259 for (i = 0; i < cThreads; i++) 265 { 266 rc = RTThreadWait(aThreads[i], 5000, NULL); 267 if (RT_FAILURE(rc)) 268 PrintError("RTThreadWait failed for thread %u (rc=%Rrc)\n", i, rc); 269 } 270 271 if (g_cbConcurrentWrite != 0) 272 PrintError("g_cbConcurrentWrite=%d at end of test!\n", g_cbConcurrentWrite); 273 if (g_cbConcurrentRead != 0) 274 PrintError("g_cbConcurrentRead=%d at end of test!\n", g_cbConcurrentRead); 275 276 rc = RTSemRWDestroy(g_hSemRW); 277 if (RT_FAILURE(rc)) 278 PrintError("RTSemRWDestroy failed - %Rrc\n", rc); 260 RTTEST_CHECK_RC(g_hTest, RTThreadWait(aThreads[i], 5000, NULL), VINF_SUCCESS); 261 262 RTTEST_CHECK_MSG(g_hTest, g_cConcurrentWriters == 0, (g_hTest, "g_cConcurrentWriters=%u at end of test\n", g_cConcurrentWriters)); 263 RTTEST_CHECK_MSG(g_hTest, g_cConcurrentReaders == 0, (g_hTest, "g_cConcurrentReaders=%u at end of test\n", g_cConcurrentReaders)); 264 265 RTTEST_CHECK_RC(g_hTest, RTSemRWDestroy(g_hSemRW), VINF_SUCCESS); 279 266 g_hSemRW = NIL_RTSEMRW; 280 if (g_cErrors) 281 RTThreadSleep(100); 267 268 // if (g_cErrors) 269 // RTThreadSleep(100); 282 270 283 271 /* 284 272 * Collect and display the results. 285 273 */ 286 uint64_t Total = g_au64[0];274 uint64_t Total = au64[0]; 287 275 for (i = 1; i < cThreads; i++) 288 Total += g_au64[i];276 Total += au64[i]; 289 277 290 278 uint64_t Normal = Total / cThreads; … … 292 280 for (i = 0; i < cThreads; i++) 293 281 { 294 uint64_t Delta = RT_ABS((int64_t)( g_au64[i] - Normal));282 uint64_t Delta = RT_ABS((int64_t)(au64[i] - Normal)); 295 283 if (Delta > Normal / 2) 296 RTPrintf("tstSemRW: Warning! Thread %d deviates by more than 50%% - %llu (it) vs. %llu (avg)\n", 297 i, g_au64[i], Normal); 284 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, 285 "Warning! Thread %u deviates by more than 50%% - %llu (it) vs. %llu (avg) - %llu%%\n", 286 i, au64[i], Normal, Delta * 100 / Normal); 298 287 if (Delta > MaxDeviation) 299 288 MaxDeviation = Delta; … … 301 290 } 302 291 303 RTPrintf("tstSemRW: Threads: %u Total: %llu Per Sec: %llu Avg: %llu ns Max dev: %llu%%\n", 304 cThreads, 305 Total, 306 Total / cSeconds, 307 ElapsedNS / Total, 308 MaxDeviation * 100 / Normal 309 ); 310 return 0; 311 } 312 292 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, 293 "Threads: %u Total: %llu Per Sec: %llu Avg: %llu ns Max dev: %llu%%\n", 294 cThreads, 295 Total, 296 Total / cSeconds, 297 ElapsedNS / Total, 298 MaxDeviation * 100 / Normal 299 ); 300 } 301 302 303 static DECLCALLBACK(int) Test2Thread(RTTHREAD hThreadSelf, void *pvUser) 304 { 305 RTSEMRW hSemRW = (RTSEMRW)pvUser; 306 307 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestRead(hSemRW, 0), VERR_TIMEOUT); 308 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestWrite(hSemRW, 0), VERR_TIMEOUT); 309 310 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestRead(hSemRW, 1), VERR_TIMEOUT); 311 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestWrite(hSemRW, 1), VERR_TIMEOUT); 312 313 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestRead(hSemRW, 50), VERR_TIMEOUT); 314 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestWrite(hSemRW, 50), VERR_TIMEOUT); 315 316 return VINF_SUCCESS; 317 } 318 319 320 static void Test2(void) 321 { 322 RTTestSub(g_hTest, "Timeout"); 323 324 RTSEMRW hSemRW = NIL_RTSEMRW; 325 RTTEST_CHECK_RC_RETV(g_hTest, RTSemRWCreate(&hSemRW), VINF_SUCCESS); 326 327 /* Lock it for writing and let the thread do the remainder of the test. */ 328 RTTEST_CHECK_RC_RETV(g_hTest, RTSemRWRequestWrite(hSemRW, RT_INDEFINITE_WAIT), VINF_SUCCESS); 329 330 RTTHREAD hThread; 331 RTTEST_CHECK_RC_RETV(g_hTest, RTThreadCreate(&hThread, Test2Thread, hSemRW, 0, 332 RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "test2"), 333 VINF_SUCCESS); 334 RTTEST_CHECK_RC(g_hTest, RTThreadWait(hThread, 15000, NULL), VINF_SUCCESS); 335 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(hSemRW), VINF_SUCCESS); 336 337 RTTEST_CHECK_RC(g_hTest, RTSemRWDestroy(hSemRW), VINF_SUCCESS); 338 } 339 340 341 static bool Test1(void) 342 { 343 RTTestSub(g_hTest, "Basics"); 344 345 RTSEMRW hSemRW = NIL_RTSEMRW; 346 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWCreate(&hSemRW), VINF_SUCCESS, false); 347 RTTEST_CHECK_RET(g_hTest, hSemRW != NIL_RTSEMRW, false); 348 349 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestRead(hSemRW, RT_INDEFINITE_WAIT), VINF_SUCCESS, false); 350 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseRead(hSemRW), VINF_SUCCESS, false); 351 352 for (unsigned cMs = 0; cMs < 50; cMs++) 353 { 354 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestRead(hSemRW, cMs), VINF_SUCCESS, false); 355 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestRead(hSemRW, cMs), VINF_SUCCESS, false); 356 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseRead(hSemRW), VINF_SUCCESS, false); 357 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseRead(hSemRW), VINF_SUCCESS, false); 358 } 359 360 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestWrite(hSemRW, RT_INDEFINITE_WAIT), VINF_SUCCESS, false); 361 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseWrite(hSemRW), VINF_SUCCESS, false); 362 363 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestWrite(hSemRW, RT_INDEFINITE_WAIT), VINF_SUCCESS, false); 364 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestRead(hSemRW, RT_INDEFINITE_WAIT), VINF_SUCCESS, false); 365 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseRead(hSemRW), VINF_SUCCESS, false); 366 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseWrite(hSemRW), VINF_SUCCESS, false); 367 368 for (unsigned cMs = 0; cMs < 50; cMs++) 369 { 370 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestWrite(hSemRW, cMs), VINF_SUCCESS, false); 371 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriteRecursion(hSemRW) == 1, false); 372 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriterReadRecursion(hSemRW) == 0, false); 373 RTTEST_CHECK_RET(g_hTest, RTSemRWIsWriteOwner(hSemRW) == true, false); 374 375 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestWrite(hSemRW, cMs), VINF_SUCCESS, false); 376 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriteRecursion(hSemRW) == 2, false); 377 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriterReadRecursion(hSemRW) == 0, false); 378 RTTEST_CHECK_RET(g_hTest, RTSemRWIsWriteOwner(hSemRW) == true, false); 379 380 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestRead(hSemRW, cMs), VINF_SUCCESS, false); 381 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriteRecursion(hSemRW) == 2, false); 382 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriterReadRecursion(hSemRW) == 1, false); 383 RTTEST_CHECK_RET(g_hTest, RTSemRWIsWriteOwner(hSemRW) == true, false); 384 385 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWRequestWrite(hSemRW, cMs), VINF_SUCCESS, false); 386 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriteRecursion(hSemRW) == 3, false); 387 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriterReadRecursion(hSemRW) == 1, false); 388 RTTEST_CHECK_RET(g_hTest, RTSemRWIsWriteOwner(hSemRW) == true, false); 389 390 /* midway */ 391 392 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseWrite(hSemRW), VINF_SUCCESS, false); 393 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriteRecursion(hSemRW) == 2, false); 394 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriterReadRecursion(hSemRW) == 1, false); 395 RTTEST_CHECK_RET(g_hTest, RTSemRWIsWriteOwner(hSemRW) == true, false); 396 397 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseRead(hSemRW), VINF_SUCCESS, false); 398 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriteRecursion(hSemRW) == 2, false); 399 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriterReadRecursion(hSemRW) == 0, false); 400 RTTEST_CHECK_RET(g_hTest, RTSemRWIsWriteOwner(hSemRW) == true, false); 401 402 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseWrite(hSemRW), VINF_SUCCESS, false); 403 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriteRecursion(hSemRW) == 1, false); 404 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriterReadRecursion(hSemRW) == 0, false); 405 RTTEST_CHECK_RET(g_hTest, RTSemRWIsWriteOwner(hSemRW) == true, false); 406 407 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWReleaseWrite(hSemRW), VINF_SUCCESS, false); 408 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriteRecursion(hSemRW) == 0, false); 409 RTTEST_CHECK_RET(g_hTest, RTSemRWGetWriterReadRecursion(hSemRW) == 0, false); 410 RTTEST_CHECK_RET(g_hTest, RTSemRWIsWriteOwner(hSemRW) == false, false); 411 } 412 413 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWDestroy(hSemRW), VINF_SUCCESS, false); 414 RTTEST_CHECK_RC_RET(g_hTest, RTSemRWDestroy(NIL_RTSEMRW), VINF_SUCCESS, false); 415 return true; 416 } 313 417 314 418 int main(int argc, char **argv) 315 419 { 316 int rc = RTR3Init(); 317 if (RT_FAILURE(rc)) 318 { 319 RTPrintf("tstSemRW: RTR3Init failed (rc=%Rrc)\n", rc); 420 int rc = RTTestInitAndCreate("tstRTSemRW", &g_hTest); 421 if (rc) 320 422 return 1; 321 }322 RTPrintf("tstSemRW: TESTING...\n"); 323 324 if (argc == 1)325 {326 /* threads, seconds, writePercent, yield, quiet */327 Test1( 1, 1, 0, true, false);328 Test1( 1, 1, 1, true, false); 329 Test1( 1, 1, 5, true, false);330 Test1( 2, 1, 3, true, false);331 Test1( 10, 1, 5, true, false);332 Test1( 10, 10, 10, false, false);333 334 RTPrintf("tstSemRW: benchmarking...\n");335 for (unsigned cThreads = 1; cThreads < 32; cThreads++)336 Test1(cThreads, 2, 1, false, true); 337 338 /** @todo add a testcase where some stuff times out. */339 }340 else 341 {342 /* threads, seconds, writePercent, yield, quiet */343 RTPrintf("tstSemRW: benchmarking...\n");344 Test1( 1, 3, 1, false, true);345 Test1( 1, 3, 1, false, true);346 Test1( 1, 3, 1, false, true);347 Test1( 2, 3, 1, false, true);348 Test1( 2, 3, 1, false, true);349 Test1( 2, 3, 1, false, true);350 Test1( 3, 3, 1, false, true);351 Test1( 3, 3, 1, false, true);352 Test1( 3, 3, 1, false, true);353 }354 355 if (!g_cErrors)356 RTPrintf("tstSemRW: SUCCESS\n");357 else358 RTPrintf("tstSemRW: FAILURE - %u errors\n", g_cErrors); 359 return g_cErrors != 0;360 } 361 423 RTTestBanner(g_hTest); 424 425 if (Test1()) 426 { 427 if (argc == 1) 428 { 429 Test2(); 430 431 /* threads, seconds, writePercent, yield, quiet */ 432 Test3( 1, 1, 0, true, false); 433 Test3( 1, 1, 1, true, false); 434 Test3( 1, 1, 5, true, false); 435 Test3( 2, 1, 3, true, false); 436 Test3( 10, 1, 5, true, false); 437 Test3( 10, 10, 10, false, false); 438 439 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "benchmarking...\n"); 440 for (unsigned cThreads = 1; cThreads < 32; cThreads++) 441 Test3(cThreads, 2, 1, false, true); 442 443 /** @todo add a testcase where some stuff times out. */ 444 } 445 else 446 { 447 /* threads, seconds, writePercent, yield, quiet */ 448 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "benchmarking...\n"); 449 Test3( 1, 3, 1, false, true); 450 Test3( 1, 3, 1, false, true); 451 Test3( 1, 3, 1, false, true); 452 Test3( 2, 3, 1, false, true); 453 Test3( 2, 3, 1, false, true); 454 Test3( 2, 3, 1, false, true); 455 Test3( 3, 3, 1, false, true); 456 Test3( 3, 3, 1, false, true); 457 Test3( 3, 3, 1, false, true); 458 } 459 } 460 461 return RTTestSummaryAndDestroy(g_hTest); 462 } 463
Note:
See TracChangeset
for help on using the changeset viewer.