1
This commit is contained in:
parent
56e52ca357
commit
35fab7672b
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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
30
a8/spinlock.cc
Normal 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
24
a8/spinlock.h
Normal 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_;
|
||||
|
||||
};
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user