Commit d32e20bc authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa

nghttpx: Make sure that Pool gets cleared when all buffers are returned

parent 8b8ba6b0
......@@ -72,7 +72,7 @@ template <size_t N> struct Memchunk {
};
template <typename T> struct Pool {
Pool() : pool(nullptr), freelist(nullptr), poolsize(0) {}
Pool() : pool(nullptr), freelist(nullptr), poolsize(0), freelistsize(0) {}
~Pool() { clear(); }
T *get() {
if (freelist) {
......@@ -80,6 +80,7 @@ template <typename T> struct Pool {
freelist = freelist->next;
m->next = nullptr;
m->reset();
freelistsize -= T::size;
return m;
}
......@@ -90,9 +91,11 @@ template <typename T> struct Pool {
void recycle(T *m) {
m->next = freelist;
freelist = m;
freelistsize += T::size;
}
void clear() {
freelist = nullptr;
freelistsize = 0;
for (auto p = pool; p;) {
auto knext = p->knext;
delete p;
......@@ -105,6 +108,7 @@ template <typename T> struct Pool {
T *pool;
T *freelist;
size_t poolsize;
size_t freelistsize;
};
template <typename Memchunk> struct Memchunks {
......
......@@ -57,7 +57,10 @@ void mcpool_clear_cb(struct ev_loop *loop, ev_timer *w, int revents) {
if (worker->get_worker_stat()->num_connections != 0) {
return;
}
worker->get_mcpool()->clear();
auto mcpool = worker->get_mcpool();
if (mcpool->freelistsize == mcpool->poolsize) {
worker->get_mcpool()->clear();
}
}
} // namespace
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment