1
This commit is contained in:
parent
2465f88e78
commit
ae48477b57
@ -1,10 +1,15 @@
|
|||||||
|
#include <cmath>
|
||||||
|
|
||||||
#include <a8/a8.h>
|
#include <a8/a8.h>
|
||||||
|
|
||||||
#include <a8/fifobuffer.h>
|
#include <a8/fifobuffer.h>
|
||||||
|
#include <a8/list.h>
|
||||||
|
|
||||||
|
const int BASE_BLOCK_SIZE = 128;
|
||||||
|
|
||||||
struct BufHead
|
struct BufHead
|
||||||
{
|
{
|
||||||
int len = 0;
|
list_head entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace a8
|
namespace a8
|
||||||
@ -17,8 +22,8 @@ namespace a8
|
|||||||
}
|
}
|
||||||
buf_ = (char*)malloc(buf_len);
|
buf_ = (char*)malloc(buf_len);
|
||||||
buf_len_ = buf_len;
|
buf_len_ = buf_len;
|
||||||
for (size_t i = 0; i < chunk_pool_.size(); ++i) {
|
for (size_t i = 0; i < free_list_.size(); ++i) {
|
||||||
INIT_LIST_HEAD(&chunk_pool_[i]);
|
INIT_LIST_HEAD(&free_list_[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,10 +36,46 @@ namespace a8
|
|||||||
|
|
||||||
char* FifoBuffer::Alloc(int len)
|
char* FifoBuffer::Alloc(int len)
|
||||||
{
|
{
|
||||||
|
if (len <= 0) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
int real_len = sizeof(BufHead) + len;
|
||||||
|
if (real_len > 1024 * 64) {
|
||||||
|
return (char*)malloc(len);
|
||||||
|
} else {
|
||||||
|
size_t index = GetIndex(real_len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FifoBuffer::Free(char* p)
|
void FifoBuffer::Free(char* p)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t FifoBuffer::GetIndex(size_t size)
|
||||||
|
{
|
||||||
|
if (size <= 128 * std::pow(2, 0)) {
|
||||||
|
return 0;
|
||||||
|
} else if (size <= 128 * std::pow(2, 1)) {
|
||||||
|
return 1;
|
||||||
|
} else if (size <= 128 * std::pow(2, 2)) {
|
||||||
|
return 2;
|
||||||
|
} else if (size <= 128 * std::pow(2, 3)) {
|
||||||
|
return 3;
|
||||||
|
} else if (size <= 128 * std::pow(2, 4)) {
|
||||||
|
return 4;
|
||||||
|
} else if (size <= 128 * std::pow(2, 5)) {
|
||||||
|
return 5;
|
||||||
|
} else if (size <= 128 * std::pow(2, 6)) {
|
||||||
|
return 6;
|
||||||
|
} else if (size <= 128 * std::pow(2, 7)) {
|
||||||
|
return 7;
|
||||||
|
} else if (size <= 128 * std::pow(2, 8)) {
|
||||||
|
return 8;
|
||||||
|
} else if (size <= 128 * std::pow(2, 9)) {
|
||||||
|
return 9;
|
||||||
|
} else {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,13 +15,17 @@ namespace a8
|
|||||||
char* Alloc(int len);
|
char* Alloc(int len);
|
||||||
void Free(char* p);
|
void Free(char* p);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
size_t GetIndex(size_t size);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
char* buf_ = nullptr;
|
char* buf_ = nullptr;
|
||||||
int buf_len_ = 0;
|
int buf_len_ = 0;
|
||||||
|
|
||||||
a8::SpinLock lock_;
|
a8::SpinLock lock_;
|
||||||
std::array<list_head, 10> chunk_pool_;
|
std::array<list_head, 10> free_list_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user