diff --git a/a8/fifobuffer.cc b/a8/fifobuffer.cc index 79351d8..4a26277 100644 --- a/a8/fifobuffer.cc +++ b/a8/fifobuffer.cc @@ -44,6 +44,21 @@ namespace a8 return (char*)malloc(len); } else { size_t index = GetIndex(real_len); + + list_head* free_node = nullptr; + { + lock_.lock(); + free_node = &free_list_[index]; + if (list_empty(free_node)) { + free_node = nullptr; + } else { + list_del(free_node); + } + lock_.unlock(); + } + if (free_node) { + return (char*)free_node + sizeof(BufHead); + } } } @@ -53,25 +68,25 @@ namespace a8 size_t FifoBuffer::GetIndex(size_t size) { - if (size <= 128 * std::pow(2, 0)) { + if (size <= BASE_BLOCK_SIZE * std::pow(2, 0)) { return 0; - } else if (size <= 128 * std::pow(2, 1)) { + } else if (size <= BASE_BLOCK_SIZE * std::pow(2, 1)) { return 1; - } else if (size <= 128 * std::pow(2, 2)) { + } else if (size <= BASE_BLOCK_SIZE * std::pow(2, 2)) { return 2; - } else if (size <= 128 * std::pow(2, 3)) { + } else if (size <= BASE_BLOCK_SIZE * std::pow(2, 3)) { return 3; - } else if (size <= 128 * std::pow(2, 4)) { + } else if (size <= BASE_BLOCK_SIZE * std::pow(2, 4)) { return 4; - } else if (size <= 128 * std::pow(2, 5)) { + } else if (size <= BASE_BLOCK_SIZE * std::pow(2, 5)) { return 5; - } else if (size <= 128 * std::pow(2, 6)) { + } else if (size <= BASE_BLOCK_SIZE * std::pow(2, 6)) { return 6; - } else if (size <= 128 * std::pow(2, 7)) { + } else if (size <= BASE_BLOCK_SIZE * std::pow(2, 7)) { return 7; - } else if (size <= 128 * std::pow(2, 8)) { + } else if (size <= BASE_BLOCK_SIZE * std::pow(2, 8)) { return 8; - } else if (size <= 128 * std::pow(2, 9)) { + } else if (size <= BASE_BLOCK_SIZE * std::pow(2, 9)) { return 9; } else { abort();