diff --git a/a8/fifobuffer.cc b/a8/fifobuffer.cc index 03af6f0..79351d8 100644 --- a/a8/fifobuffer.cc +++ b/a8/fifobuffer.cc @@ -1,10 +1,15 @@ +#include + #include #include +#include + +const int BASE_BLOCK_SIZE = 128; struct BufHead { - int len = 0; + list_head entry; }; namespace a8 @@ -17,8 +22,8 @@ namespace a8 } buf_ = (char*)malloc(buf_len); buf_len_ = buf_len; - for (size_t i = 0; i < chunk_pool_.size(); ++i) { - INIT_LIST_HEAD(&chunk_pool_[i]); + for (size_t i = 0; i < free_list_.size(); ++i) { + INIT_LIST_HEAD(&free_list_[i]); } } @@ -31,10 +36,46 @@ namespace a8 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) { } + 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(); + } + } + } diff --git a/a8/fifobuffer.h b/a8/fifobuffer.h index d34b899..e9b4ec9 100644 --- a/a8/fifobuffer.h +++ b/a8/fifobuffer.h @@ -15,13 +15,17 @@ namespace a8 char* Alloc(int len); void Free(char* p); + private: + + size_t GetIndex(size_t size); + private: char* buf_ = nullptr; int buf_len_ = 0; a8::SpinLock lock_; - std::array chunk_pool_; + std::array free_list_; }; }