| | |
| | | std::atomic<uint64_t> nwrite(0); |
| | | std::atomic<uint64_t> writedone(0); |
| | | |
| | | #if 1 |
| | | const int kPower = 0; |
| | | typedef AtomicQueue<kPower> Rcb; |
| | | typedef AtomicQ63 Rcb; |
| | | |
| | | Rcb tmp; |
| | | // BOOST_CHECK(tmp.like_empty()); |
| | | BOOST_CHECK(tmp.push(1)); |
| | | if (kPower != 0) { |
| | | BOOST_CHECK(tmp.tail() == 1); |
| | | } |
| | | BOOST_CHECK(tmp.head() == 0); |
| | | int64_t d; |
| | | BOOST_CHECK(tmp.pop(d)); |
| | | if (kPower != 0) { |
| | | // BOOST_CHECK(tmp.like_empty()); |
| | | BOOST_CHECK(tmp.head() == 1); |
| | | BOOST_CHECK(tmp.tail() == 1); |
| | | } |
| | | |
| | | ShmObject<Rcb> rcb(shm, "test_rcb"); |
| | | NamedShmObject<Rcb> rcb(shm, "test_rcb", eOpenOrCreate); |
| | | bool try_more = true; |
| | | |
| | | auto Writer = [&]() { |
| | |
| | | } |
| | | } |
| | | }; |
| | | |
| | | #else |
| | | typedef Circular<int64_t> Rcb; |
| | | ShmObject<Rcb> rcb(shm, "test_rcb", 16, shm.get_segment_manager()); |
| | | |
| | | typedef FMutex Mutex; |
| | | // typedef SemMutex Mutex; |
| | | Mutex mtx(123); |
| | | auto Writer = [&]() { |
| | | uint64_t n = 0; |
| | | while ((n = nwrite++) < nmsg) { |
| | | auto Write = [&]() { |
| | | robust::Guard<Mutex> lk(mtx); |
| | | if (rcb->full()) { |
| | | return false; |
| | | } else { |
| | | rcb->push_back(n); |
| | | return true; |
| | | } |
| | | // return rcb->push_back(n); |
| | | }; |
| | | while (!Write()) { |
| | | // MySleep(); |
| | | } |
| | | ++writedone; |
| | | } |
| | | }; |
| | | std::atomic<uint64_t> nread(0); |
| | | auto Reader = [&]() { |
| | | while (nread.load() < nmsg) { |
| | | int64_t d; |
| | | auto Read = [&]() { |
| | | robust::Guard<Mutex> lk(mtx); |
| | | if (rcb->empty()) { |
| | | return false; |
| | | } else { |
| | | d = rcb->front(); |
| | | rcb->pop_front(); |
| | | return true; |
| | | } |
| | | // return rcb->pop_front(d); |
| | | }; |
| | | if (Read()) { |
| | | ++nread; |
| | | total += d; |
| | | } else { |
| | | // MySleep(); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | #endif |
| | | |
| | | auto status = [&]() { |
| | | auto next = steady_clock::now(); |