From 365c864a587365fe443b11cc0cd7cfc8f8f8eb81 Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期二, 01 六月 2021 11:19:22 +0800
Subject: [PATCH] refactor, clean up useless code.

---
 src/robust.cpp |   71 ++++++++++++++++++-----------------
 1 files changed, 37 insertions(+), 34 deletions(-)

diff --git a/src/robust.cpp b/src/robust.cpp
index 4654652..015f97a 100644
--- a/src/robust.cpp
+++ b/src/robust.cpp
@@ -22,43 +22,46 @@
 namespace robust
 {
 
-namespace
+bool AtomicReqRep::ClientRequest(const Data request, Data &reply)
 {
-static_assert(sizeof(steady_clock::duration) == sizeof(int64_t));
-
-auto Now() { return steady_clock::now().time_since_epoch(); }
-void Yield() { std::this_thread::sleep_for(10us); }
-
-} // namespace
-
-void QuickSleep() { Yield(); }
-
-bool FMutex::try_lock()
-{
-	if (flock(fd_, LOCK_EX | LOCK_NB) == 0) {
-		++count_;
-		if (mtx_.try_lock()) {
-			return true;
-		} else {
-			if (--count_ == 0) {
-				flock(fd_, LOCK_UN);
-			}
+	auto end_time = now() + 3s;
+	do {
+		Data cur = data_.load();
+		if (GetState(cur) == eStateFree &&
+		    DataCas(cur, Encode(request, eStateRequest))) {
+			do {
+				yield();
+				cur = data_.load();
+				if (GetState(cur) == eStateReply) {
+					DataCas(cur, Encode(0, eStateFree));
+					reply = Decode(cur);
+					return true;
+				}
+			} while (now() < end_time);
 		}
+		yield();
+	} while (now() < end_time);
+	return false;
+}
+
+bool AtomicReqRep::ServerProcess(Handler onReq)
+{
+	Data cur = data_.load();
+	switch (GetState(cur)) {
+	case eStateRequest:
+		if (DataCas(cur, Encode(onReq(Decode(cur)), eStateReply))) {
+			timestamp_ = now();
+			return true;
+		}
+		break;
+	case eStateReply:
+		if (timestamp_.load() + 3s < now()) {
+			DataCas(cur, Encode(0, eStateFree));
+		}
+		break;
+	case eStateFree:
+	default: break;
 	}
 	return false;
 }
-void FMutex::lock()
-{
-	flock(fd_, LOCK_EX);
-	++count_;
-	mtx_.lock();
-}
-void FMutex::unlock()
-{
-	mtx_.unlock();
-	if (--count_ == 0) {
-		flock(fd_, LOCK_UN);
-	}
-}
-
 } // namespace robust
\ No newline at end of file

--
Gitblit v1.8.0