From 628c1c21ffb19d8c96ed9ce89531595f9870ab1a Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期五, 23 四月 2021 18:41:02 +0800
Subject: [PATCH] add msg tag; recv all msgs before remove mq.

---
 utest/api_test.cpp |   56 +++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/utest/api_test.cpp b/utest/api_test.cpp
index a91db43..79236ba 100644
--- a/utest/api_test.cpp
+++ b/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 < 1000 * 1000 * 10; ++i) {
 				mutex.lock();
 				mutex.unlock();
 			}

--
Gitblit v1.8.0