1
This commit is contained in:
parent
56e52ca357
commit
35fab7672b
@ -17,7 +17,9 @@ namespace a8
|
|||||||
}
|
}
|
||||||
buf_ = (char*)malloc(buf_len);
|
buf_ = (char*)malloc(buf_len);
|
||||||
buf_len_ = 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()
|
FifoBuffer::~FifoBuffer()
|
||||||
@ -29,29 +31,10 @@ namespace a8
|
|||||||
|
|
||||||
char* FifoBuffer::Alloc(int len)
|
char* FifoBuffer::Alloc(int len)
|
||||||
{
|
{
|
||||||
if (len <= 0) {
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
int real_len = len + sizeof(BufHead);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FifoBuffer::Free(char* p)
|
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
|
#pragma once
|
||||||
|
|
||||||
#include <atomic>
|
#include <a8/spinlock.h>
|
||||||
|
|
||||||
namespace a8
|
namespace a8
|
||||||
{
|
{
|
||||||
@ -19,10 +19,9 @@ namespace a8
|
|||||||
|
|
||||||
char* buf_ = nullptr;
|
char* buf_ = nullptr;
|
||||||
int buf_len_ = 0;
|
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