]> err.no Git - varnish/commitdiff
Add functions for allocating and freeing bereq structures.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Tue, 3 Jul 2007 19:32:21 +0000 (19:32 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Tue, 3 Jul 2007 19:32:21 +0000 (19:32 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1631 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_backend.c

index c6ca2051518f3697e817f0a9523bb8ada0c55071..f8f4c83043dc5078d2bade3027e3992d51e1ec53 100644 (file)
@@ -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);
index 948d1b2dc4ef881ef4bab55e8b709d7c8aeb8d98..5061b81d06be6611f0a4c2f2002230cd78154844 100644 (file)
@@ -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)
 {