From 4817f67c177200bfff5b9ebc58fd9742a8940dd7 Mon Sep 17 00:00:00 2001 From: phk Date: Tue, 3 Jul 2007 19:32:21 +0000 Subject: [PATCH] Add functions for allocating and freeing bereq structures. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1631 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache.h | 10 ++++++ varnish-cache/bin/varnishd/cache_backend.c | 38 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/varnish-cache/bin/varnishd/cache.h b/varnish-cache/bin/varnishd/cache.h index c6ca2051..f8f4c830 100644 --- a/varnish-cache/bin/varnishd/cache.h +++ b/varnish-cache/bin/varnishd/cache.h @@ -184,6 +184,14 @@ struct workreq { /* Backend Connection ------------------------------------------------*/ +struct bereq { + unsigned magic; +#define BEREQ_MAGIC 0x3b6d250c + TAILQ_ENTRY(bereq) list; + struct ws ws[1]; + struct http http[1]; +}; + struct vbe_conn { unsigned magic; #define VBE_CONN_MAGIC 0x0c5e6592 @@ -362,6 +370,8 @@ void VBE_Init(void); struct vbe_conn *VBE_GetFd(struct sess *sp); void VBE_ClosedFd(struct worker *w, struct vbe_conn *vc, int already); void VBE_RecycleFd(struct worker *w, struct vbe_conn *vc); +struct bereq *vbe_new_bereq(void); +void vbe_free_bereq(struct bereq *bereq); /* cache_ban.c */ void BAN_Init(void); diff --git a/varnish-cache/bin/varnishd/cache_backend.c b/varnish-cache/bin/varnishd/cache_backend.c index 948d1b2d..5061b81d 100644 --- a/varnish-cache/bin/varnishd/cache_backend.c +++ b/varnish-cache/bin/varnishd/cache_backend.c @@ -59,6 +59,7 @@ /* A backend IP */ static TAILQ_HEAD(,vbe_conn) vbe_head = TAILQ_HEAD_INITIALIZER(vbe_head); +static TAILQ_HEAD(,bereq) bereq_head = TAILQ_HEAD_INITIALIZER(bereq_head); static MTX vbemtx; @@ -76,6 +77,43 @@ Uptime(void) /*--------------------------------------------------------------------*/ +struct bereq * +vbe_new_bereq(void) +{ + struct bereq *bereq; + volatile unsigned space; + + LOCK(&vbemtx); + bereq = TAILQ_FIRST(&bereq_head); + if (bereq != NULL) + TAILQ_REMOVE(&bereq_head, bereq, list); + UNLOCK(&vbemtx); + if (bereq == NULL) { + space = params->mem_workspace; + bereq = calloc(sizeof *bereq + space, 1); + if (bereq == NULL) + return (NULL); + bereq->magic = BEREQ_MAGIC; + WS_Init(bereq->ws, bereq + 1, space); + } + WS_Reset(bereq->ws); + return (bereq); +} + +/*--------------------------------------------------------------------*/ +/* XXX: no backpressure on pool size */ + +void +vbe_free_bereq(struct bereq *bereq) +{ + + LOCK(&vbemtx); + TAILQ_INSERT_HEAD(&bereq_head, bereq, list); + UNLOCK(&vbemtx); +} + +/*--------------------------------------------------------------------*/ + static struct vbe_conn * vbe_new_conn(void) { -- 2.39.5