lichao
2021-04-25 58e3540930d290b315fd24d0414c8feeb7bc8bc1
utest/api_test.cpp
@@ -151,19 +151,61 @@
      }
      st_.nlock_ += n;
   }
   void unlock() { mutex_.unlock(); }
   void unlock()
   {
      auto old_time = last_lock_time_.load();
      if (Now() - old_time > limit_) {
      } else {
         if (last_lock_time_.compare_exchange_strong(old_time, Now())) {
            mutex_.unlock();
         }
      }
   }
};
namespace
{
typedef int64_t Offset;
Offset Addr(void *ptr) { return reinterpret_cast<Offset>(ptr); }
void *Ptr(const Offset offset) { return reinterpret_cast<void *>(offset); }
} // namespace
BOOST_AUTO_TEST_CASE(MutexTest)
{
   const std::string shm_name("ShmMutex");
   // ShmRemover auto_remove(shm_name);
   SharedMemory shm(shm_name, 1024 * 1024 * 10);
   SharedMemory &shm = TestShm();
   MsgI::BindShm(shm);
   void *base_ptr = shm.get_address();
   auto PrintPtr = [&](void *p) {
      printf("addr: %ld, ptr: %p, offset: %ld\n", Addr(p), p, Addr(p) - Addr(base_ptr));
   };
   printf("base");
   PrintPtr(base_ptr);
   MsgI msg;
   msg.Make("string data");
   for (int i = 0; i < 10; ++i) {
      int n = msg.AddRef();
      printf("add %d ref: %d\n", i, n);
   }
   for (int i = 0; i < 10; ++i) {
      int n = msg.Release();
      printf("release %d, ref : %d\n", i, n);
   }
   std::this_thread::sleep_for(1s);
   msg.Release();
   const std::string mtx_name("test_mutex");
   const std::string int_name("test_int");
   auto mtx = shm.find_or_construct<Mutex>(mtx_name.c_str())(3s);
   auto mtx = shm.find_or_construct<Mutex>(mtx_name.c_str())();
   auto pi = shm.find_or_construct<int>(int_name.c_str())(100);
   printf("mutetx ");
   PrintPtr(mtx);
   printf("int ");
   PrintPtr(pi);
   typedef std::chrono::steady_clock Clock;
   auto Now = []() { return Clock::now().time_since_epoch(); };
   if (pi) {
@@ -177,7 +219,7 @@
      TLMutex mutex;
      // CasMutex mutex;
      auto Lock = [&]() {
         for (int i = 0; i < 1000 * 100; ++i) {
         for (int i = 0; i < 10; ++i) {
            mutex.lock();
            mutex.unlock();
         }