summaryrefslogtreecommitdiff
path: root/src/reqpool.c
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2020-09-01 13:16:43 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2020-10-11 11:43:06 -0400
commit878073d1c9192e0d94f0e31f550009da75e3bb7d (patch)
treed101da1832cb6139a39fbaa7d575aa566736bdbd /src/reqpool.c
parent550609c8ae1e3de49029871d332827e2e2cb0406 (diff)
downloadlighttpd-git-878073d1c9192e0d94f0e31f550009da75e3bb7d.tar.gz
[core] keep pool of (request_st *) for HTTP/2
Diffstat (limited to 'src/reqpool.c')
-rw-r--r--src/reqpool.c56
1 files changed, 47 insertions, 9 deletions
diff --git a/src/reqpool.c b/src/reqpool.c
index a473a672..1b32a0dd 100644
--- a/src/reqpool.c
+++ b/src/reqpool.c
@@ -19,7 +19,7 @@
void
-request_init (request_st * const r, connection * const con, server * const srv)
+request_init_data (request_st * const r, connection * const con, server * const srv)
{
r->write_queue = chunkqueue_init();
r->read_queue = chunkqueue_init();
@@ -166,7 +166,7 @@ request_reset_ex (request_st * const r)
void
-request_free (request_st * const r)
+request_free_data (request_st * const r)
{
chunkqueue_free(r->reqbody_queue);
chunkqueue_free(r->write_queue);
@@ -200,6 +200,32 @@ request_free (request_st * const r)
}
+/* linked list of (request_st *) cached for reuse */
+static request_st *reqpool;
+/* max num of (request_st *) to cache */
+static uint32_t reqspace;
+
+
+void
+request_pool_init (uint32_t sz)
+{
+ reqspace = sz;
+}
+
+
+void
+request_pool_free (void)
+{
+ while (reqpool) {
+ request_st * const r = reqpool;
+ reqpool = (request_st *)r->con; /*(reuse r->con as next ptr)*/
+ request_free_data(r);
+ free(r);
+ ++reqspace;
+ }
+}
+
+
void
request_release (request_st * const r)
{
@@ -217,19 +243,31 @@ request_release (request_st * const r)
request_reset_ex(r);
r->state = CON_STATE_CONNECT;
- /* future: might keep a pool of reusable (request_st *) */
- request_free(r);
- free(r);
+ if (reqspace) {
+ --reqspace;
+ r->con = (connection *)reqpool; /*(reuse r->con as next ptr)*/
+ reqpool = r;
+ }
+ else {
+ request_free_data(r);
+ free(r);
+ }
}
request_st *
request_acquire (connection * const con)
{
- /* future: might keep a pool of reusable (request_st *) */
- request_st * const r = calloc(1, sizeof(request_st));
- force_assert(r);
- request_init(r, con, con->srv);
+ request_st *r = reqpool;
+ if (r) {
+ reqpool = (request_st *)r->con; /*(reuse r->con as next ptr)*/
+ ++reqspace;
+ }
+ else {
+ r = calloc(1, sizeof(request_st));
+ force_assert(r);
+ request_init_data(r, con, con->srv);
+ }
r->con = con;
r->tmp_buf = con->srv->tmp_buf;