2323#include < thread>
2424#include < future> // std::async
2525#include < mutex>
26+ #include < stop_token>
2627
2728#include " catch2/catch_test_macros.hpp"
2829#include " catch2/catch_template_test_macros.hpp"
3536
3637using namespace std ::literals::string_literals;
3738
38- constexpr int N = 400 ;
39+ constexpr int N = 40 ;
3940
4041// WQ creation function with non-used pointer for overloading
4142template <typename T>
@@ -89,9 +90,14 @@ void non_threaded_arithmetic_test(Q& wq, int count) {
8990 REQUIRE (wq.push (base_val));
9091 }
9192 val_type sum { 0 };
92- wq.apply ( [&sum] (const val_type& i ) { sum += i ; } );
93+ wq.apply ( [&sum] (const val_type& x ) { sum += x ; } );
9394 REQUIRE (sum == expected_sum);
9495
96+ for (int i {0 }; i < count; ++i) {
97+ REQUIRE (*(wq.try_pop ()) == base_val);
98+ }
99+ REQUIRE (wq.empty ());
100+
95101 for (int i {0 }; i < count; ++i) {
96102 wq.push (base_val+i);
97103 }
@@ -110,7 +116,7 @@ template <typename T>
110116using test_set = std::set<set_elem<T> >;
111117
112118template <typename T, typename Q>
113- void read_func (Q& wq, test_set<T>& s, std::mutex& mut) {
119+ void read_func (std::stop_token stop_tok, Q& wq, test_set<T>& s, std::mutex& mut) {
114120 while (true ) {
115121 std::optional<set_elem<T> > opt_elem = wq.wait_and_pop ();
116122 if (!opt_elem) { // empty element means request stop has been called
@@ -122,7 +128,7 @@ void read_func (Q& wq, test_set<T>& s, std::mutex& mut) {
122128}
123129
124130template <typename T, typename Q>
125- void write_func (Q& wq, int start, int slice, const T& val) {
131+ void write_func (std::stop_token stop_tok, Q& wq, int start, int slice, const T& val) {
126132 for (int i {0 }; i < slice; ++i) {
127133 if (!wq.push (set_elem<T>{(start+i), val})) {
128134 // FAIL("wait queue push failed in write_func");
@@ -169,14 +175,13 @@ bool threaded_test(Q& wq, int num_readers, int num_writers, int slice, const T&
169175 REQUIRE (wq.empty ());
170176 REQUIRE (wq.stop_requested ());
171177 // check set to make sure all entries are present
172- REQUIRE (s.size () == tot);
173178 int idx {0 };
174179 for (const auto & e : s) {
175180 REQUIRE (e.first == idx);
176181 REQUIRE (e.second == val);
177182 ++idx;
178183 }
179- return true ;
184+ return (s. size () == tot) ;
180185}
181186
182187// non threaded test, multiple container types, multiple element types
@@ -408,22 +413,25 @@ SCENARIO ( "Threaded wait queue, deque int",
408413
409414 chops::wait_queue<set_elem<int > > wq;
410415
411- // Parameters are 1 reader, 1 writer thread, 100 slice
412- // threads will be created and joined
413- REQUIRE ( threaded_test (wq, 1 , 1 , 100 , 44 ) );
416+ SECTION ( " 1 reader, 1 writer thread, 100 slice" ) {
417+ REQUIRE ( threaded_test (wq, 1 , 1 , 100 , 44 ) );
418+ }
414419
415- // Parameters are 5 reader, 3 writer threads, 1000 slice
416- REQUIRE ( threaded_test (wq, 5 , 3 , 1000 , 1212 ) );
417- // Parameters are 60 reader, 40 writer threads, 5000 slice
418- REQUIRE ( threaded_test (wq, 60 , 40 , 5000 , 5656 ) );
420+ SECTION ( " 5 reader, 3 writer threads, 1000 slice" ) {
421+ REQUIRE ( threaded_test (wq, 5 , 3 , 1000 , 1212 ) );
422+ }
423+ SECTION ( " 60 reader, 40 writer threads, 5000 slice" ) {
424+ REQUIRE ( threaded_test (wq, 60 , 40 , 5000 , 5656 ) );
425+ }
419426}
420427
421428SCENARIO ( " Threaded wait queue, deque string" ,
422429 " [wait_queue] [threaded] [string] [deque]" ) {
423430
424431 chops::wait_queue<set_elem<std::string> > wq;
425432
426- // Parameters are 60 reader, 40 writer threads, 12000 slice
427- REQUIRE ( threaded_test (wq, 60 , 40 , 12000 , " cool, lit, sup" s) );
433+ SECTION ( " 60 reader, 40 writer threads, 12000 slice" ) {
434+ REQUIRE ( threaded_test (wq, 60 , 40 , 12000 , " cool, lit, sup" s) );
435+ }
428436}
429437
0 commit comments