This commit is contained in:
azw 2023-05-13 11:55:32 +00:00
parent 56e52ca357
commit 35fab7672b
4 changed files with 60 additions and 24 deletions

View File

@ -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);
}
}
}

View File

@ -1,6 +1,6 @@
#pragma once
#include <atomic>
#include <a8/spinlock.h>
namespace a8
{
@ -19,10 +19,9 @@ namespace a8
char* buf_ = nullptr;
int buf_len_ = 0;
std::atomic<int> head_ = 0;
std::atomic<int> tail_ = 0;
std::atomic<int> capacity_ = 0;
a8::SpinLock lock_;
std::array<list_head, 10> chunk_pool_;
};
}

30
a8/spinlock.cc Normal file
View File

@ -0,0 +1,30 @@
#include <a8/a8.h>
#include <a8/spinlock.h>
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);
}
}

24
a8/spinlock.h Normal file
View File

@ -0,0 +1,24 @@
#pragma once
#include <atomic>
namespace a8
{
class SpinLock
{
public:
SpinLock();
~SpinLock();
void lock();
void unlock();
private:
std::atomic<bool> flags_;
};
}