liuxiaolong
2021-07-20 58d904a328c0d849769b483e901a0be9426b8209
utest/robust_test.cpp
@@ -68,26 +68,14 @@
   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 = [&]() {
@@ -111,58 +99,6 @@
         }
      }
   };
#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();