From 056f71f24cefaf88f2a93714c6678c03ed5f1e0e Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期五, 02 七月 2021 16:54:33 +0800
Subject: [PATCH] fixed to adapt gcc-5.4 & glibc-2.25
---
src/robust.cpp | 74 ++++++++++++++++++++++--------------
1 files changed, 45 insertions(+), 29 deletions(-)
diff --git a/src/robust.cpp b/src/robust.cpp
index 26d41b9..b4e0613 100644
--- a/src/robust.cpp
+++ b/src/robust.cpp
@@ -16,43 +16,59 @@
* =====================================================================================
*/
#include "robust.h"
-#include <chrono>
#include <thread>
+
+using namespace std::chrono;
+using namespace std::chrono_literals;
+
+namespace
+{
+void yield() { std::this_thread::sleep_for(10us); }
+} // namespace
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 (mtx_.try_lock()) {
- if (flock(fd_, LOCK_EX | LOCK_NB) == 0) {
- return true;
- } else {
- mtx_.unlock();
+ 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()
-{
- mtx_.lock();
- flock(fd_, LOCK_EX);
-}
-void FMutex::unlock()
-{
- flock(fd_, LOCK_UN);
- mtx_.unlock();
-}
-
} // namespace robust
\ No newline at end of file
--
Gitblit v1.8.0