| | |
| | | } |
| | | void unlock() { 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) { |