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的位置 --- src/robust.cpp | 117 ++++++++++++++++++++-------------------------------------- 1 files changed, 40 insertions(+), 77 deletions(-) diff --git a/src/robust.cpp b/src/robust.cpp index 006ea5f..b4e0613 100644 --- a/src/robust.cpp +++ b/src/robust.cpp @@ -16,96 +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)); -static_assert(sizeof(RobustReqRep) == 24); -static_assert(sizeof(Mutex) == 8); -static_assert(sizeof(CircularBuffer<int>) == 48); - -auto Now() { return steady_clock::now().time_since_epoch(); } -const steady_clock::duration kIoTimeout = 10ms; -const steady_clock::duration kIoExpire = 100ms; - -void Yield() { std::this_thread::sleep_for(10us); } -} // namespace - -void QuickSleep() -{ - Yield(); -} -bool RobustReqRep::StateCas(State exp, State val) -{ - bool r = state_.compare_exchange_strong(exp, val); - return r ? (timestamp_.store(Now()), true) : false; -} - -int RobustReqRep::ClientReadReply(Msg &reply) -{ - auto end_time = Now() + kIoTimeout; - int done = false; + auto end_time = now() + 3s; do { - if (StateCas(eServerWriteEnd, eClientReadBegin)) { - Read(reply); - done = StateCas(eClientReadBegin, eClientReadEnd); - if (done) { break; } + 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 done ? eSuccess : eTimeout; + yield(); + } while (now() < end_time); + return false; } -int RobustReqRep::ClientWriteRequest(const Msg &request) +bool AtomicReqRep::ServerProcess(Handler onReq) { - if (request.size() > capacity_) { - return eSizeError; - } - auto end_time = Now() + kIoTimeout; - bool done = false; - do { - if (StateCas(eStateReady, eClientWriteBegin)) { - Write(request); - done = StateCas(eClientWriteBegin, eClientWriteEnd); - if (done) { break; } + Data cur = data_.load(); + switch (GetState(cur)) { + case eStateRequest: + if (DataCas(cur, Encode(onReq(Decode(cur)), eStateReply))) { + timestamp_ = now(); + return true; } - Yield(); - } while (Now() < end_time); - return done ? eSuccess : eTimeout; -} - -int RobustReqRep::ServerReadRequest(Msg &request) -{ - bool done = false; - if (StateCas(eClientWriteEnd, eServerReadBegin)) { - Read(request); - done = StateCas(eServerReadBegin, eServerReadEnd); - } else { - auto old = state_.load(); - if (old != eStateReady && timestamp_.load() + kIoExpire < Now()) { - StateCas(old, eStateReady); + break; + case eStateReply: + if (timestamp_.load() + 3s < now()) { + DataCas(cur, Encode(0, eStateFree)); } + break; + case eStateFree: + default: break; } - return done ? eSuccess : eTimeout; + return false; } - -int RobustReqRep::ServerWriteReply(const Msg &reply) -{ - if (reply.size() > capacity_) { - return eSizeError; - } - // no need to loop write, either success or timeout. - bool done = false; - if (StateCas(eServerReadEnd, eServerWriteBegin)) { - Write(reply); - done = StateCas(eServerWriteBegin, eServerWriteEnd); - } - return done ? eSuccess : eTimeout; -} - } // namespace robust \ No newline at end of file -- Gitblit v1.8.0