13 #ifndef _GU_MEM_POOL_HPP_
14 #define _GU_MEM_POOL_HPP_
16 #include "gu_lock.hpp"
17 #include "gu_macros.hpp"
27 typedef std::vector<void*> MemPoolVector;
31 template <
bool thread_safe>
37 MemPool(
int buf_size,
int reserve = 0,
const char* name =
"")
48 pool_.reserve(reserve_);
54 assert(pool_.size() == allocd_);
56 for (
size_t i(0); i < pool_.size(); ++i)
65 void* ret(from_pool());
67 if (!ret) ret = alloc();
72 void recycle(
void* buf)
74 if (!to_pool(buf)) free(buf);
77 void print(std::ostream& os)
const
84 hr /= hits_ + misses_;
87 os <<
"MemPool(" << name_
88 <<
"): hit ratio: " << hr
89 <<
", misses: " << misses_
90 <<
", in use: " << allocd_ - pool_.size()
91 <<
", in pool: " << pool_.size();
94 size_t buf_size()
const {
return buf_size_; }
105 if (pool_.size() > 0)
122 bool to_pool(
void* buf)
126 bool const ret(reserve_ + allocd_/2 > pool_.size());
130 pool_.push_back(buf);
143 return (
operator new(buf_size_));
146 void free(
void*
const buf)
149 operator delete(buf);
160 const char*
const name_;
161 unsigned int const buf_size_;
162 unsigned int const reserve_;
180 MemPool(
int buf_size,
int reserve = 0,
const char* name =
"")
181 : base_(buf_size, reserve, name), mtx_ () {}
191 ret = base_.from_pool();
194 if (!ret) ret = base_.alloc();
199 void recycle(
void* buf)
205 pooled = base_.to_pool(buf);
208 if (!pooled) base_.free(buf);
211 void print(std::ostream& os)
const
217 size_t buf_size()
const {
return base_.buf_size(); }
226 template <
bool thread_safe>
227 std::ostream& operator << (std::ostream& os,
230 mp.print(os);
return os;
233 typedef MemPool<false> MemPoolUnsafe;
234 typedef MemPool<true> MemPoolSafe;
Definition: gu_lock.hpp:20
Definition: gu_mutex.hpp:19
Definition: gu_mem_pool.hpp:32