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.h | 187 +--------------------------------------------- 1 files changed, 4 insertions(+), 183 deletions(-) diff --git a/src/robust.h b/src/robust.h index b3b99c4..1bbe8fc 100644 --- a/src/robust.h +++ b/src/robust.h @@ -31,6 +31,7 @@ #include <sys/sem.h> #include <sys/stat.h> #include <sys/types.h> +#include <thread> #include <unistd.h> namespace robust @@ -38,144 +39,6 @@ using namespace std::chrono; using namespace std::chrono_literals; -void QuickSleep(); - -class CasMutex -{ - typedef uint64_t locker_t; - static inline locker_t this_locker() { return pthread_self(); } - static const uint64_t kLockerMask = MaskBits(63); - -public: - CasMutex() : - meta_(0) {} - int try_lock() - { - auto old = meta_.load(); - int r = 0; - if (!Locked(old)) { - r = MetaCas(old, Meta(1, this_locker())); - } - return r; - } - int lock() - { - int r = 0; - do { - r = try_lock(); - } while (r == 0); - return r; - } - void unlock() - { - auto old = meta_.load(); - if (Locked(old) && Locker(old) == this_locker()) { - MetaCas(old, Meta(0, this_locker())); - } - } - -private: - std::atomic<uint64_t> meta_; - bool Locked(uint64_t meta) { return (meta >> 63) == 1; } - locker_t Locker(uint64_t meta) { return meta & kLockerMask; } - uint64_t Meta(uint64_t lk, locker_t lid) { return (lk << 63) | lid; } - bool MetaCas(uint64_t exp, uint64_t val) { return meta_.compare_exchange_strong(exp, val); } -}; - -class NullMutex -{ -public: - template <class... T> - explicit NullMutex(T &&...t) {} // easy test. - bool try_lock() { return true; } - void lock() {} - void unlock() {} -}; - -// flock + mutex -class FMutex -{ -public: - typedef uint64_t id_t; - FMutex(id_t id) : - id_(id), fd_(Open(id_)), count_(0) - { - if (fd_ == -1) { throw "error create mutex!"; } - } - ~FMutex() { Close(fd_); } - bool try_lock(); - void lock(); - void unlock(); - -private: - static std::string GetPath(id_t id) - { - const std::string dir("/tmp/.bhome_mtx"); - mkdir(dir.c_str(), 0777); - return dir + "/fm_" + std::to_string(id); - } - static int Open(id_t id) { return open(GetPath(id).c_str(), O_CREAT | O_RDONLY, 0666); } - static int Close(int fd) { return close(fd); } - id_t id_; - int fd_; - std::mutex mtx_; - std::atomic<int32_t> count_; -}; - -union semun { - int val; /* Value for SETVAL */ - struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ - unsigned short *array; /* Array for GETALL, SETALL */ - struct seminfo *__buf; /* Buffer for IPC_INFO - (Linux-specific) */ -}; - -class SemMutex -{ -public: - SemMutex(key_t key) : - key_(key), sem_id_(semget(key, 1, 0666)) - { - if (sem_id_ == -1) { throw "error create semaphore."; } - } - ~SemMutex() {} - - bool try_lock() - { - sembuf op = {0, -1, SEM_UNDO | IPC_NOWAIT}; - return semop(sem_id_, &op, 1) == 0; - } - - void lock() - { - sembuf op = {0, -1, SEM_UNDO}; - semop(sem_id_, &op, 1); - } - - void unlock() - { - sembuf op = {0, 1, SEM_UNDO}; - semop(sem_id_, &op, 1); - } - -private: - key_t key_; - int sem_id_; -}; - -template <class Lock> -class Guard -{ -public: - Guard(Lock &l) : - l_(l) { l_.lock(); } - ~Guard() { l_.unlock(); } - -private: - Guard(const Guard &); - Guard(Guard &&); - Lock &l_; -}; template <unsigned PowerSize = 4, class Int = int64_t> class AtomicQueue @@ -194,8 +57,6 @@ AtomicQueue() { memset(this, 0, sizeof(*this)); } size_type head() const { return head_.load(); } size_type tail() const { return tail_.load(); } - bool like_empty() const { return head() == tail() && Empty(buf[head()]); } - bool like_full() const { return head() == tail() && !Empty(buf[head()]); } bool push(const Data d, bool try_more = false) { bool r = false; @@ -276,48 +137,8 @@ public: typedef int64_t Data; typedef std::function<Data(const Data)> Handler; - bool ClientRequest(const Data request, Data &reply) - { - 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 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; - } + bool ClientRequest(const Data request, Data &reply); + bool ServerProcess(Handler onReq); private: enum State { @@ -328,7 +149,7 @@ static int GetState(Data d) { return d & MaskBits(3); } static Data Encode(Data d, State st) { return (d << 3) | st; } static Data Decode(Data d) { return d >> 3; } - static void yield() { QuickSleep(); } + static void yield() { std::this_thread::sleep_for(10us); } typedef steady_clock::duration Duration; Duration now() { return steady_clock::now().time_since_epoch(); } -- Gitblit v1.8.0