mirror of
https://github.com/caozhiyi/CppNet.git
synced 2026-01-19 00:05:14 +08:00
66 lines
1.6 KiB
C++
66 lines
1.6 KiB
C++
#include "BlockMemaryPool.h"
|
|
|
|
using namespace base;
|
|
|
|
CBlockMemoryPool::CBlockMemoryPool(const int large_sz, const int add_num) :
|
|
_large_size(RoundUp(large_sz)),
|
|
_number_large_add_nodes(add_num) {
|
|
|
|
}
|
|
|
|
CBlockMemoryPool::~CBlockMemoryPool() {
|
|
// free all memory
|
|
std::unique_lock<std::mutex> lock(_large_mutex);
|
|
for (auto iter = _free_mem_vec.begin(); iter != _free_mem_vec.end(); ++iter) {
|
|
free(*iter);
|
|
}
|
|
}
|
|
|
|
void* CBlockMemoryPool::PoolLargeMalloc() {
|
|
if (_free_mem_vec.empty()) {
|
|
Expansion();
|
|
}
|
|
|
|
std::unique_lock<std::mutex> lock(_large_mutex);
|
|
void* ret = _free_mem_vec.front();
|
|
_free_mem_vec.pop_back();
|
|
return ret;
|
|
}
|
|
|
|
void CBlockMemoryPool::PoolLargeFree(void* &m) {
|
|
std::unique_lock<std::mutex> lock(_large_mutex);
|
|
_free_mem_vec.push_back(m);
|
|
}
|
|
|
|
int CBlockMemoryPool::GetSize() {
|
|
std::unique_lock<std::mutex> lock(_large_mutex);
|
|
return _free_mem_vec.size();
|
|
}
|
|
|
|
void CBlockMemoryPool::ReleaseHalf() {
|
|
std::unique_lock<std::mutex> lock(_large_mutex);
|
|
size_t size = _free_mem_vec.size();
|
|
size_t hale = size / 2;
|
|
for (auto iter = _free_mem_vec.begin(); iter != _free_mem_vec.end(); ++iter) {
|
|
size--;
|
|
if (size <= hale) {
|
|
break;
|
|
}
|
|
void* mem = *iter;
|
|
iter = _free_mem_vec.erase(iter);
|
|
free(mem);
|
|
}
|
|
}
|
|
|
|
void CBlockMemoryPool::Expansion(int num) {
|
|
if (num = 0) {
|
|
num = _number_large_add_nodes;
|
|
}
|
|
|
|
std::unique_lock<std::mutex> lock(_large_mutex);
|
|
for (int i = 0; i < num; ++i) {
|
|
void* mem = malloc(_large_size);
|
|
// not memset!
|
|
_free_mem_vec.push_back(mem);
|
|
}
|
|
} |