From 58d904a328c0d849769b483e901a0be9426b8209 Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期二, 20 七月 2021 20:20:44 +0800
Subject: [PATCH] 调整Request C.BHFree的位置

---
 utest/robust_test.cpp |  224 +++++++------------------------------------------------
 1 files changed, 31 insertions(+), 193 deletions(-)

diff --git a/utest/robust_test.cpp b/utest/robust_test.cpp
index e7b8894..23dc058 100644
--- a/utest/robust_test.cpp
+++ b/utest/robust_test.cpp
@@ -16,6 +16,35 @@
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
+BOOST_AUTO_TEST_CASE(InitTest)
+{
+	AtomicReqRep rr;
+	auto client = [&]() {
+		for (int i = 0; i < 5; ++i) {
+			int64_t reply = 0;
+			bool r = rr.ClientRequest(i, reply);
+			printf("init request %d, %s, reply %d\n", i, (r ? "ok" : "failed"), reply);
+		}
+	};
+
+	bool run = true;
+	auto server = [&]() {
+		auto onReq = [](int64_t req) { return req + 100; };
+		while (run) {
+			rr.ServerProcess(onReq);
+		}
+	};
+
+	ThreadManager clients, servers;
+	servers.Launch(server);
+	for (int i = 0; i < 2; ++i) {
+		clients.Launch(client);
+	}
+	clients.WaitAll();
+	run = false;
+	servers.WaitAll();
+}
+
 BOOST_AUTO_TEST_CASE(QueueTest)
 {
 	const int nthread = 100;
@@ -39,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 = [&]() {
@@ -82,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();
@@ -167,130 +132,3 @@
 	printf("total: %ld, expected: %ld\n", total.load(), correct_total);
 	BOOST_CHECK_EQUAL(total.load(), correct_total);
 }
-
-BOOST_AUTO_TEST_CASE(MutexTest)
-{
-	{
-		int sem_id = semget(100, 1, 0666 | IPC_CREAT);
-		auto P = [&]() {
-			sembuf op = {0, -1, SEM_UNDO};
-			semop(sem_id, &op, 1);
-		};
-		auto V = [&]() {
-			sembuf op = {0, 1, SEM_UNDO};
-			semop(sem_id, &op, 1);
-		};
-		for (int i = 0; i < 10; ++i) {
-			V();
-		}
-		Sleep(10s);
-
-		return;
-	}
-
-	// typedef robust::MFMutex RobustMutex;
-	typedef robust::SemMutex RobustMutex;
-
-	for (int i = 0; i < 20; ++i) {
-		int size = i;
-		int left = size & 7;
-		int rsize = size + ((8 - left) & 7);
-		printf("size: %3d, rsize: %3d\n", size, rsize);
-	}
-	SharedMemory &shm = TestShm();
-	// shm.Remove();
-	// return;
-	GlobalInit(shm);
-
-	const std::string mtx_name("test_mutex");
-	const std::string int_name("test_int");
-	// auto mtx = shm.FindOrCreate<RobustMutex>(mtx_name, 12345);
-	RobustMutex rmtx(12345);
-	auto mtx = &rmtx;
-	auto pi = shm.FindOrCreate<int>(int_name, 100);
-
-	std::mutex m;
-	typedef std::chrono::steady_clock Clock;
-
-	if (pi) {
-		auto old = *pi;
-		printf("int : %d, add1: %d\n", old, ++*pi);
-	}
-
-	auto LockSpeed = [](auto &mutex, const std::string &name) {
-		const int ntimes = 1000 * 1;
-		auto Lock = [&]() {
-			for (int i = 0; i < ntimes; ++i) {
-				mutex.lock();
-				mutex.unlock();
-			}
-		};
-		printf("\nTesting %s lock/unlock %d times\n", name.c_str(), ntimes);
-		{
-			boost::timer::auto_cpu_timer timer;
-			printf("1 thread: ");
-			Lock();
-		}
-		auto InThread = [&](int nthread) {
-			boost::timer::auto_cpu_timer timer;
-			printf("%d threads: ", nthread);
-			std::vector<std::thread> vt;
-			for (int i = 0; i < nthread; ++i) {
-				vt.emplace_back(Lock);
-			}
-			for (auto &t : vt) {
-				t.join();
-			}
-		};
-		InThread(4);
-		InThread(16);
-		InThread(100);
-		InThread(1000);
-	};
-	NullMutex null_mtx;
-	std::mutex std_mtx;
-	CasMutex cas_mtx;
-	FMutex mfmtx(3);
-	boost::interprocess::interprocess_mutex ipc_mutex;
-	SemMutex sem_mtx(3);
-	LockSpeed(null_mtx, "null mutex");
-	LockSpeed(std_mtx, "std::mutex");
-	// LockSpeed(cas_mtx, "CAS mutex");
-	LockSpeed(ipc_mutex, "boost ipc mutex");
-	LockSpeed(mfmtx, "mutex+flock");
-	LockSpeed(sem_mtx, "sem mutex");
-
-	auto TryLock = [&]() {
-		if (mtx->try_lock()) {
-			printf("try_lock ok\n");
-			return true;
-		} else {
-			printf("try_lock failed\n");
-			return false;
-		}
-	};
-	auto Unlock = [&]() {
-		mtx->unlock();
-		printf("unlocked\n");
-	};
-
-	if (mtx) {
-		printf("mtx exists\n");
-		if (TryLock()) {
-			// Sleep(10s);
-			auto op = [&]() {
-				if (TryLock()) {
-					Unlock();
-				}
-			};
-			op();
-			std::thread t(op);
-			t.join();
-			// Unlock();
-		} else {
-			// mtx->unlock();
-		}
-	} else {
-		printf("mtx not exists\n");
-	}
-}
\ No newline at end of file

--
Gitblit v1.8.0