diff --git a/src/circ_elem_array.h b/src/circ_elem_array.h index c38a59d..3f7e4a5 100644 --- a/src/circ_elem_array.h +++ b/src/circ_elem_array.h @@ -34,7 +34,7 @@ enum : std::size_t { template class elem_array : private elem_array_head { struct head_t { - std::atomic rc_ { 0 }; // read counter + std::atomic rc_ { 0 }; // read counter }; public: @@ -46,8 +46,6 @@ public: block_size = elem_size * elem_max }; - static_assert(data_size % alignof(head_t) == 0, "data_size must be multiple of alignof(head_t)"); - private: struct elem_t { head_t head_; @@ -101,10 +99,10 @@ public: elem_t* el = elem(wt_.load(std::memory_order_acquire)); // check all consumers have finished reading while(1) { - std::size_t expected = 0; + std::uint32_t expected = 0; if (el->head_.rc_.compare_exchange_weak( expected, - static_cast(cc_.load(std::memory_order_relaxed)), + static_cast(cc_.load(std::memory_order_relaxed)), std::memory_order_release)) { break; } diff --git a/test/test_circ_elem_array.cpp b/test/test_circ_elem_array.cpp index 8bc8e47..70160d1 100644 --- a/test/test_circ_elem_array.cpp +++ b/test/test_circ_elem_array.cpp @@ -58,15 +58,16 @@ void test_prod_cons(void) { int dat_; }; + std::unordered_map> list[std::extent::value]; + int cid = 0; for (auto& t : consumers) { - t = std::thread{[&] { + t = std::thread{[&, cid] { auto cur = cq__->cursor(); std::cout << "start consumer " << &t << ": cur = " << (int)cur << std::endl; cq__->connect(); std::unique_ptr guard(cq__, [](cq_t* cq) { cq->disconnect(); }); - std::unordered_map> list; do { while (cur != cq__->cursor()) { msg_t* pmsg = static_cast(cq__->take(cur)), @@ -74,7 +75,7 @@ void test_prod_cons(void) { cq__->put(pmsg); if (msg.pid_ < 0) goto finished; ++cur; - list[msg.pid_].push_back(msg.dat_); + list[cid][msg.pid_].push_back(msg.dat_); } } while(1); finished: @@ -82,18 +83,21 @@ void test_prod_cons(void) { auto ts = sw.elapsed(); std::cout << "[" << N << ":" << M << ", " << Loops << "]" << std::endl << "performance: " << (double(ts) / double(Loops * N)) << " us/d" << std::endl; - } - std::cout << "confirming..." << std::endl; - for (int n = 0; n < static_cast(std::extent::value); ++n) { - auto& vec = list[n]; - QCOMPARE(vec.size(), static_cast(Loops)); - int i = 0; - for (int d : vec) { - QCOMPARE(i, d); - ++i; + std::cout << "confirming..." << std::endl; + for (auto& cons_vec : list) { + for (int n = 0; n < static_cast(std::extent::value); ++n) { + auto& vec = cons_vec[n]; + QCOMPARE(vec.size(), static_cast(Loops)); + int i = 0; + for (int d : vec) { + QCOMPARE(i, d); + ++i; + } + } } } }}; + ++cid; } while (cq__->conn_count() != std::extent::value) {