37
37
using namespace BloombergLP ;
38
38
using namespace bsl ;
39
39
40
- // ============================================================================
41
- // TEST HELPERS UTILITY
42
- // ----------------------------------------------------------------------------
43
- namespace {
44
-
45
- // / Thread function: wait on the specified `barrier` and then generate the
46
- // / specified `numGUIDs` (in a tight loop) and store them in the specified
47
- // / `out`.
48
- static void threadFunction (int threadId,
49
- bsl::vector<bsl::pair<bmqt::Uri, int > >* out,
50
- bslmt::Barrier* barrier,
51
- int numIterations)
52
- {
53
- out->reserve (numIterations);
54
- barrier->wait ();
55
-
56
- for (int i = 0 ; i < numIterations; ++i) {
57
- bmqu::MemOutStream osstrDomain (bmqtst::TestHelperUtil::allocator ());
58
- bmqu::MemOutStream osstrQueue (bmqtst::TestHelperUtil::allocator ());
59
- osstrDomain << " my.domain." << threadId << " ." << i;
60
- osstrQueue << " queue-foo-bar-" << threadId << " -" << i;
61
-
62
- bmqt::Uri qualifiedUri (bmqtst::TestHelperUtil::allocator ());
63
- bmqt::UriBuilder builder (bmqtst::TestHelperUtil::allocator ());
64
- builder.setDomain (osstrDomain.str ());
65
- builder.setQueue (osstrQueue.str ());
66
-
67
- int rc = builder.uri (&qualifiedUri);
68
- out->push_back (bsl::make_pair (qualifiedUri, rc));
69
- }
70
- }
71
-
72
- } // close unnamed namespace
73
-
74
40
// ============================================================================
75
41
// TESTS
76
42
// ----------------------------------------------------------------------------
@@ -452,36 +418,60 @@ static void test2_URIBuilder()
452
418
// / from multiple threads.
453
419
static void test3_URIBuilderMultiThreaded ()
454
420
{
455
- bmqtst::TestHelperUtil::ignoreCheckGblAlloc () = true ;
456
- bmqtst::TestHelperUtil::ignoreCheckDefAlloc () = true ;
457
- // Can't ensure no global memory is allocated because
458
- // 'bslmt::ThreadUtil::create()' uses the global allocator to allocate
459
- // memory.
460
-
461
421
bmqtst::TestHelper::printTestName (" MULTI-THREADED URI BUILDER TEST" );
462
422
463
423
bmqt::UriParser::initialize (bmqtst::TestHelperUtil::allocator ());
464
424
465
- const int k_NUM_THREADS = 6 ;
466
- const int k_NUM_ITERATIONS = 10000 ;
467
- bslmt::ThreadGroup threadGroup (bmqtst::TestHelperUtil::allocator ());
425
+ const size_t k_NUM_THREADS = 6 ;
426
+ const size_t k_NUM_ITERATIONS = 10000 ;
427
+
428
+ struct Local {
429
+ static void threadFunction (size_t threadId,
430
+ bsl::vector<bmqt::Uri>* out,
431
+ bslmt::Barrier* barrier)
432
+ {
433
+ out->reserve (k_NUM_ITERATIONS);
434
+ barrier->wait ();
435
+
436
+ for (size_t i = 0 ; i < k_NUM_ITERATIONS; ++i) {
437
+ bmqu::MemOutStream osstrDomain (
438
+ bmqtst::TestHelperUtil::allocator ());
439
+ bmqu::MemOutStream osstrQueue (
440
+ bmqtst::TestHelperUtil::allocator ());
441
+ osstrDomain << " my.domain." << threadId << " ." << i;
442
+ osstrQueue << " queue-foo-bar-" << threadId << " -" << i;
443
+
444
+ bmqt::Uri qualifiedUri (bmqtst::TestHelperUtil::allocator ());
445
+ bmqt::UriBuilder builder (bmqtst::TestHelperUtil::allocator ());
446
+ builder.setDomain (osstrDomain.str ());
447
+ builder.setQueue (osstrQueue.str ());
448
+
449
+ const int rc = builder.uri (&qualifiedUri);
450
+ BMQTST_ASSERT_EQ_D (" Failed to build bmqt::Uri, i="
451
+ << i << " , rc=" << rc,
452
+ rc,
453
+ 0 );
454
+ out->emplace_back (bslmf::MovableRefUtil::move (qualifiedUri));
455
+ }
456
+ }
457
+ };
468
458
469
459
// Barrier to get each thread to start at the same time; `+1` for this
470
460
// (main) thread.
471
461
bslmt::Barrier barrier (k_NUM_THREADS + 1 );
472
462
473
- typedef bsl::pair<bmqt::Uri, int > Result;
474
-
475
- bsl::vector<bsl::vector<Result> > threadsData (
463
+ bsl::vector<bsl::vector<bmqt::Uri> > threadsData (
476
464
bmqtst::TestHelperUtil::allocator ());
477
465
threadsData.resize (k_NUM_THREADS);
478
466
479
- for (int i = 0 ; i < k_NUM_THREADS; ++i) {
480
- int rc = threadGroup.addThread (bdlf::BindUtil::bind (&threadFunction,
481
- i,
482
- &threadsData[i],
483
- &barrier,
484
- k_NUM_ITERATIONS));
467
+ bslmt::ThreadGroup threadGroup (bmqtst::TestHelperUtil::allocator ());
468
+ for (size_t i = 0 ; i < k_NUM_THREADS; ++i) {
469
+ const int rc = threadGroup.addThread (
470
+ bdlf::BindUtil::bindS (bmqtst::TestHelperUtil::allocator (),
471
+ &Local::threadFunction,
472
+ i,
473
+ &threadsData[i],
474
+ &barrier));
485
475
BMQTST_ASSERT_EQ_D (i, rc, 0 );
486
476
}
487
477
@@ -490,27 +480,20 @@ static void test3_URIBuilderMultiThreaded()
490
480
491
481
// Validate for each thread.
492
482
493
- for (int i = 0 ; i < k_NUM_THREADS; ++i) {
494
- const bsl::vector<Result>& threadResults = threadsData[i];
495
-
496
- BSLS_ASSERT_OPT (threadResults.size () ==
497
- static_cast <size_t >(k_NUM_ITERATIONS));
483
+ for (size_t i = 0 ; i < k_NUM_THREADS; ++i) {
484
+ const bsl::vector<bmqt::Uri>& uris = threadsData[i];
498
485
499
- for (int j = 0 ; j < k_NUM_ITERATIONS; ++j) {
500
- BMQTST_ASSERT_EQ_D (i << " , " << j,
501
- threadResults[j].second ,
502
- 0 ); // builder rc
486
+ BMQTST_ASSERT_EQ (uris.size (), k_NUM_ITERATIONS);
503
487
488
+ for (size_t j = 0 ; j < k_NUM_ITERATIONS; ++j) {
504
489
bmqu::MemOutStream expectedUriStr (
505
490
bmqtst::TestHelperUtil::allocator ());
506
491
expectedUriStr << " bmq://my.domain." << i << " ." << j
507
492
<< " /queue-foo-bar-" << i << " -" << j;
508
493
bmqt::Uri expectedUri (expectedUriStr.str (),
509
494
bmqtst::TestHelperUtil::allocator ());
510
495
511
- BMQTST_ASSERT_EQ_D (i << " , " << j,
512
- threadResults[j].first ,
513
- expectedUri);
496
+ BMQTST_ASSERT_EQ_D (i << " , " << j, uris[j], expectedUri);
514
497
}
515
498
}
516
499
0 commit comments