From 35fab7672b26e27d97401463441a14cff62fdb82 Mon Sep 17 00:00:00 2001 From: azw Date: Sat, 13 May 2023 11:55:32 +0000 Subject: [PATCH] 1 --- a8/fifobuffer.cc | 23 +++-------------------- a8/fifobuffer.h | 7 +++---- a8/spinlock.cc | 30 ++++++++++++++++++++++++++++++ a8/spinlock.h | 24 ++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 a8/spinlock.cc create mode 100644 a8/spinlock.h diff --git a/a8/fifobuffer.cc b/a8/fifobuffer.cc index 029388d..03af6f0 100644 --- a/a8/fifobuffer.cc +++ b/a8/fifobuffer.cc @@ -17,7 +17,9 @@ namespace a8 } buf_ = (char*)malloc(buf_len); buf_len_ = buf_len; - capacity_ = buf_len; + for (size_t i = 0; i < chunk_pool_.size(); ++i) { + INIT_LIST_HEAD(&chunk_pool_[i]); + } } FifoBuffer::~FifoBuffer() @@ -29,29 +31,10 @@ namespace a8 char* FifoBuffer::Alloc(int len) { - if (len <= 0) { - abort(); - } - int real_len = len + sizeof(BufHead); } void FifoBuffer::Free(char* p) { - if (p >= buf_ && p < buf_ + buf_len_) { - if (p != buf_ + head_) { - abort(); - } - BufHead* buf_head = (BufHead*)(p - sizeof(BufHead)); - head_ += sizeof(BufHead) + buf_head->len; - if (head_ >= buf_len_) { - capacity_ += sizeof(BufHead) + buf_head->len + (buf_len_ - head_); - head_ = 0; - } else { - capacity_ += sizeof(BufHead) + buf_head->len; - } - } else { - free(p); - } } } diff --git a/a8/fifobuffer.h b/a8/fifobuffer.h index 3bd8979..d34b899 100644 --- a/a8/fifobuffer.h +++ b/a8/fifobuffer.h @@ -1,6 +1,6 @@ #pragma once -#include +#include namespace a8 { @@ -19,10 +19,9 @@ namespace a8 char* buf_ = nullptr; int buf_len_ = 0; - std::atomic head_ = 0; - std::atomic tail_ = 0; - std::atomic capacity_ = 0; + a8::SpinLock lock_; + std::array chunk_pool_; }; } diff --git a/a8/spinlock.cc b/a8/spinlock.cc new file mode 100644 index 0000000..4ffb55e --- /dev/null +++ b/a8/spinlock.cc @@ -0,0 +1,30 @@ +#include + +#include + +namespace a8 +{ + + SpinLock::SpinLock(): flag_(false) + { + } + + SpinLock::~SpinLock() + { + + } + + SpinLock::lock() + { + bool expect = false; + while (!flag_.compare_exchange_weak(except, true)) { + + } + } + + SpinLock::unlock() + { + flag_.store(false); + } + +} diff --git a/a8/spinlock.h b/a8/spinlock.h new file mode 100644 index 0000000..f8ab2b2 --- /dev/null +++ b/a8/spinlock.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +namespace a8 +{ + + class SpinLock + { + public: + + SpinLock(); + ~SpinLock(); + + void lock(); + void unlock(); + + private: + + std::atomic flags_; + + }; + +}