1
This commit is contained in:
parent
787f6a5faf
commit
effb812c83
@ -10,6 +10,7 @@ const int BASE_BLOCK_SIZE = 128;
|
|||||||
struct BufHead
|
struct BufHead
|
||||||
{
|
{
|
||||||
list_head entry;
|
list_head entry;
|
||||||
|
int len;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace a8
|
namespace a8
|
||||||
@ -43,10 +44,9 @@ namespace a8
|
|||||||
if (real_len > 1024 * 64) {
|
if (real_len > 1024 * 64) {
|
||||||
return (char*)malloc(len);
|
return (char*)malloc(len);
|
||||||
} else {
|
} else {
|
||||||
size_t index = GetIndex(real_len);
|
|
||||||
|
|
||||||
BufHead* buf_head = nullptr;
|
BufHead* buf_head = nullptr;
|
||||||
{
|
{
|
||||||
|
size_t index = GetIndex(real_len);
|
||||||
lock_.lock();
|
lock_.lock();
|
||||||
list_head* head = &free_list_[index];
|
list_head* head = &free_list_[index];
|
||||||
if (!list_empty(head)) {
|
if (!list_empty(head)) {
|
||||||
@ -54,15 +54,33 @@ namespace a8
|
|||||||
list_del(&buf_head->entry);
|
list_del(&buf_head->entry);
|
||||||
}
|
}
|
||||||
lock_.unlock();
|
lock_.unlock();
|
||||||
|
if (buf_head) {
|
||||||
|
return (char*)buf_head + sizeof(BufHead);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (buf_head) {
|
int p = offset_.fetch_add(len);
|
||||||
return (char*)buf_head + sizeof(BufHead);
|
if (p > buf_len_) {
|
||||||
|
offset_.fetch_sub(len);
|
||||||
|
return (char*)malloc(len);
|
||||||
}
|
}
|
||||||
|
buf_head = buf_ + p;
|
||||||
|
buf_head->len = len;
|
||||||
|
return buf_ + p + sizeof(BufHead);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FifoBuffer::Free(char* p)
|
void FifoBuffer::Free(char* p)
|
||||||
{
|
{
|
||||||
|
if (p > buf_ && p < buf_ + buf_len_) {
|
||||||
|
BufHead* buf_head = (BufHead*)(p - sizeof(BufHead));
|
||||||
|
int real_len = sizeof(BufHead) + buf_head->len;
|
||||||
|
size_t index = GetIndex(real_len);
|
||||||
|
lock_.lock();
|
||||||
|
list_add(&buf_head->entry, &free_list_[index]);
|
||||||
|
lock_.unlock();
|
||||||
|
} else {
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t FifoBuffer::GetIndex(size_t size)
|
size_t FifoBuffer::GetIndex(size_t size)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user