Merge pull request #1544 from nghttp2/nghttpx-clear-mcpool
nghttpx: Make sure that Pool gets cleared when all buffers are returned
This commit is contained in:
commit
563c117303
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue