[experimental-ims] 0bcfeee Move busyobj to their own source file, they are not really backend related and will have somewhat complex semantics.
Geoff Simmons
geoff at varnish-cache.org
Mon Jan 9 21:52:49 CET 2012
commit 0bcfeee0ae14213f4277b199dadaaab481b7273f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Dec 8 06:17:22 2011 +0000
Move busyobj to their own source file, they are not really
backend related and will have somewhat complex semantics.
diff --git a/bin/varnishd/Makefile.am b/bin/varnishd/Makefile.am
index 2116701..a4bae7f 100644
--- a/bin/varnishd/Makefile.am
+++ b/bin/varnishd/Makefile.am
@@ -16,6 +16,7 @@ varnishd_SOURCES = \
cache/cache_backend_cfg.c \
cache/cache_backend_poll.c \
cache/cache_ban.c \
+ cache/cache_busyobj.c \
cache/cache_center.c \
cache/cache_cli.c \
cache/cache_dir.c \
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 24c1dc9..0ee855b 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -673,12 +673,6 @@ void VDI_RecycleFd(struct worker *wrk, struct vbc **vbp);
void VDI_AddHostHeader(struct worker *wrk, const struct vbc *vbc);
void VBE_Poll(void);
-/* cache_backend.c */
-void VBE_Init(void);
-struct busyobj *VBE_GetBusyObj(struct worker *wrk);
-struct busyobj *VBE_RefBusyObj(struct busyobj *busyobj);
-void VBE_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj);
-
/* cache_backend_cfg.c */
void VBE_InitCfg(void);
struct backend *VBE_AddBackend(struct cli *cli, const struct vrt_backend *vb);
@@ -703,6 +697,12 @@ struct ban *BAN_RefBan(struct objcore *oc, double t0, const struct ban *tail);
void BAN_TailDeref(struct ban **ban);
double BAN_Time(const struct ban *ban);
+/* cache_busyobj.c */
+void VBO_Init(void);
+struct busyobj *VBO_GetBusyObj(struct worker *wrk);
+struct busyobj *VBO_RefBusyObj(struct busyobj *busyobj);
+void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj);
+
/* cache_center.c [CNT] */
void CNT_Session(struct sess *sp);
void CNT_Init(void);
diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index cf9d60f..4d2f18a 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -43,105 +43,6 @@
#include "vrt.h"
#include "vtcp.h"
-static struct lock nbusyobj_mtx;
-static struct busyobj *nbusyobj;
-
-void
-VBE_Init(void)
-{
- Lck_New(&nbusyobj_mtx, lck_nbusyobj);
- nbusyobj = NULL;
-}
-
-/*--------------------------------------------------------------------
- * BusyObj handling
- */
-
-static struct busyobj *
-vbe_NewBusyObj(void)
-{
- struct busyobj *busyobj;
-
- ALLOC_OBJ(busyobj, BUSYOBJ_MAGIC);
- AN(busyobj);
- Lck_New(&busyobj->mtx, lck_busyobj);
- return (busyobj);
-}
-
-static void
-vbe_FreeBusyObj(struct busyobj *busyobj)
-{
- CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
- AZ(busyobj->refcount);
- Lck_Delete(&busyobj->mtx);
- FREE_OBJ(busyobj);
-}
-
-struct busyobj *
-VBE_GetBusyObj(struct worker *wrk)
-{
- struct busyobj *busyobj = NULL;
-
- (void)wrk;
- Lck_Lock(&nbusyobj_mtx);
- if (nbusyobj != NULL) {
- CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC);
- busyobj = nbusyobj;
- nbusyobj = NULL;
- memset((char *)busyobj + offsetof(struct busyobj, refcount), 0,
- sizeof *busyobj - offsetof(struct busyobj, refcount));
- }
- Lck_Unlock(&nbusyobj_mtx);
- if (busyobj == NULL)
- busyobj = vbe_NewBusyObj();
- AN(busyobj);
- busyobj->refcount = 1;
- busyobj->beresp = wrk->x_beresp;
- busyobj->bereq = wrk->x_bereq;
- return (busyobj);
-}
-
-struct busyobj *
-VBE_RefBusyObj(struct busyobj *busyobj)
-{
- CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
- Lck_Lock(&busyobj->mtx);
- assert(busyobj->refcount > 0);
- busyobj->refcount++;
- Lck_Unlock(&busyobj->mtx);
- return (busyobj);
-}
-
-void
-VBE_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
-{
- struct busyobj *busyobj;
-
- (void)wrk;
- busyobj = *pbo;
- CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
- Lck_Lock(&busyobj->mtx);
- assert(busyobj->refcount > 0);
- busyobj->refcount--;
- *pbo = NULL;
- if (busyobj->refcount > 0) {
- Lck_Unlock(&busyobj->mtx);
- return;
- }
- Lck_Unlock(&busyobj->mtx);
-
- /* XXX Sanity checks e.g. AZ(busyobj->vbc) */
-
- Lck_Lock(&nbusyobj_mtx);
- if (nbusyobj == NULL) {
- nbusyobj = busyobj;
- busyobj = NULL;
- }
- Lck_Unlock(&nbusyobj_mtx);
- if (busyobj != NULL)
- vbe_FreeBusyObj(busyobj);
-}
-
/*--------------------------------------------------------------------
* The "simple" director really isn't, since thats where all the actual
* connections happen. Nontheless, pretend it is simple by sequestering
diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
new file mode 100644
index 0000000..32bad7e
--- /dev/null
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -0,0 +1,138 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006-2011 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Handle backend connections and backend request structures.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#include "cache.h"
+
+static struct lock nbusyobj_mtx;
+static struct busyobj *nbusyobj;
+
+void
+VBO_Init(void)
+{
+ Lck_New(&nbusyobj_mtx, lck_nbusyobj);
+ nbusyobj = NULL;
+}
+
+/*--------------------------------------------------------------------
+ * BusyObj handling
+ */
+
+static struct busyobj *
+vbo_NewBusyObj(void)
+{
+ struct busyobj *busyobj;
+
+ ALLOC_OBJ(busyobj, BUSYOBJ_MAGIC);
+ AN(busyobj);
+ Lck_New(&busyobj->mtx, lck_busyobj);
+ return (busyobj);
+}
+
+static void
+vbe_FreeBusyObj(struct busyobj *busyobj)
+{
+ CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
+ AZ(busyobj->refcount);
+ Lck_Delete(&busyobj->mtx);
+ FREE_OBJ(busyobj);
+}
+
+struct busyobj *
+VBO_GetBusyObj(struct worker *wrk)
+{
+ struct busyobj *busyobj = NULL;
+
+ (void)wrk;
+ Lck_Lock(&nbusyobj_mtx);
+ if (nbusyobj != NULL) {
+ CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC);
+ busyobj = nbusyobj;
+ nbusyobj = NULL;
+ memset((char *)busyobj + offsetof(struct busyobj, refcount), 0,
+ sizeof *busyobj - offsetof(struct busyobj, refcount));
+ }
+ Lck_Unlock(&nbusyobj_mtx);
+ if (busyobj == NULL)
+ busyobj = vbo_NewBusyObj();
+ AN(busyobj);
+ busyobj->refcount = 1;
+ busyobj->beresp = wrk->x_beresp;
+ busyobj->bereq = wrk->x_bereq;
+ return (busyobj);
+}
+
+struct busyobj *
+VBO_RefBusyObj(struct busyobj *busyobj)
+{
+ CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
+ Lck_Lock(&busyobj->mtx);
+ assert(busyobj->refcount > 0);
+ busyobj->refcount++;
+ Lck_Unlock(&busyobj->mtx);
+ return (busyobj);
+}
+
+void
+VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
+{
+ struct busyobj *busyobj;
+
+ (void)wrk;
+ busyobj = *pbo;
+ CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
+ Lck_Lock(&busyobj->mtx);
+ assert(busyobj->refcount > 0);
+ busyobj->refcount--;
+ *pbo = NULL;
+ if (busyobj->refcount > 0) {
+ Lck_Unlock(&busyobj->mtx);
+ return;
+ }
+ Lck_Unlock(&busyobj->mtx);
+
+ /* XXX Sanity checks e.g. AZ(busyobj->vbc) */
+
+ Lck_Lock(&nbusyobj_mtx);
+ if (nbusyobj == NULL) {
+ nbusyobj = busyobj;
+ busyobj = NULL;
+ }
+ Lck_Unlock(&nbusyobj_mtx);
+ if (busyobj != NULL)
+ vbe_FreeBusyObj(busyobj);
+}
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index 442e2bb..8826ae2 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -255,7 +255,7 @@ cnt_prepresp(struct sess *sp)
AN(wrk->busyobj->do_stream);
VDI_CloseFd(wrk, &wrk->busyobj->vbc);
HSH_Drop(wrk);
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
} else {
(void)HSH_Deref(wrk, NULL, &wrk->obj);
}
@@ -464,7 +464,7 @@ cnt_error(struct sess *sp)
if (wrk->obj == NULL) {
HSH_Prealloc(sp);
AZ(wrk->busyobj);
- wrk->busyobj = VBE_GetBusyObj(wrk);
+ wrk->busyobj = VBO_GetBusyObj(wrk);
wrk->obj = STV_NewObject(wrk, NULL, cache_param->http_resp_size,
(uint16_t)cache_param->http_max_hdr);
if (wrk->obj == NULL)
@@ -508,7 +508,7 @@ cnt_error(struct sess *sp)
if (sp->handling == VCL_RET_RESTART &&
sp->restarts < cache_param->max_restarts) {
HSH_Drop(wrk);
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
sp->director = NULL;
sp->restarts++;
sp->step = STP_RECV;
@@ -525,7 +525,7 @@ cnt_error(struct sess *sp)
sp->err_code = 0;
sp->err_reason = NULL;
http_Setup(wrk->busyobj->bereq, NULL);
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
sp->step = STP_PREPRESP;
return (0);
}
@@ -654,7 +654,7 @@ cnt_fetch(struct sess *sp)
AZ(HSH_Deref(wrk, wrk->objcore, NULL));
wrk->objcore = NULL;
}
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
sp->director = NULL;
wrk->storage_hint = NULL;
@@ -827,7 +827,7 @@ cnt_fetchbody(struct sess *sp)
sp->err_code = 503;
sp->step = STP_ERROR;
VDI_CloseFd(wrk, &wrk->busyobj->vbc);
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
return (0);
}
CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC);
@@ -896,7 +896,7 @@ cnt_fetchbody(struct sess *sp)
if (i) {
HSH_Drop(wrk);
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
AZ(wrk->obj);
sp->err_code = 503;
sp->step = STP_ERROR;
@@ -909,7 +909,7 @@ cnt_fetchbody(struct sess *sp)
AN(wrk->obj->objcore->ban);
HSH_Unbusy(wrk);
}
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
wrk->acct_tmp.fetch++;
sp->step = STP_PREPRESP;
return (0);
@@ -983,7 +983,7 @@ cnt_streambody(struct sess *sp)
assert(WRW_IsReleased(wrk));
assert(wrk->wrw.ciov == wrk->wrw.siov);
(void)HSH_Deref(wrk, NULL, &wrk->obj);
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
http_Setup(wrk->resp, NULL);
sp->step = STP_DONE;
return (0);
@@ -1253,7 +1253,7 @@ cnt_miss(struct sess *sp)
AN(wrk->objcore);
CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
WS_Reset(wrk->ws, NULL);
- wrk->busyobj = VBE_GetBusyObj(wrk);
+ wrk->busyobj = VBO_GetBusyObj(wrk);
http_Setup(wrk->busyobj->bereq, wrk->ws);
http_FilterHeader(sp, HTTPH_R_FETCH);
http_ForceGet(wrk->busyobj->bereq);
@@ -1278,13 +1278,13 @@ cnt_miss(struct sess *sp)
AZ(HSH_Deref(wrk, wrk->objcore, NULL));
wrk->objcore = NULL;
http_Setup(wrk->busyobj->bereq, NULL);
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
sp->step = STP_ERROR;
return (0);
case VCL_RET_PASS:
AZ(HSH_Deref(wrk, wrk->objcore, NULL));
wrk->objcore = NULL;
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
sp->step = STP_PASS;
return (0);
case VCL_RET_FETCH:
@@ -1294,7 +1294,7 @@ cnt_miss(struct sess *sp)
case VCL_RET_RESTART:
AZ(HSH_Deref(wrk, wrk->objcore, NULL));
wrk->objcore = NULL;
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
INCOMPL();
default:
WRONG("Illegal action in vcl_miss{}");
@@ -1345,9 +1345,9 @@ cnt_pass(struct sess *sp)
AZ(wrk->obj);
AZ(wrk->busyobj);
- wrk->busyobj = VBE_GetBusyObj(wrk);
+ wrk->busyobj = VBO_GetBusyObj(wrk);
WS_Reset(wrk->ws, NULL);
- wrk->busyobj = VBE_GetBusyObj(wrk);
+ wrk->busyobj = VBO_GetBusyObj(wrk);
http_Setup(wrk->busyobj->bereq, wrk->ws);
http_FilterHeader(sp, HTTPH_R_PASS);
@@ -1357,7 +1357,7 @@ cnt_pass(struct sess *sp)
VCL_pass_method(sp);
if (sp->handling == VCL_RET_ERROR) {
http_Setup(wrk->busyobj->bereq, NULL);
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
sp->step = STP_ERROR;
return (0);
}
@@ -1405,9 +1405,9 @@ cnt_pipe(struct sess *sp)
AZ(wrk->busyobj);
wrk->acct_tmp.pipe++;
- wrk->busyobj = VBE_GetBusyObj(wrk);
+ wrk->busyobj = VBO_GetBusyObj(wrk);
WS_Reset(wrk->ws, NULL);
- wrk->busyobj = VBE_GetBusyObj(wrk);
+ wrk->busyobj = VBO_GetBusyObj(wrk);
http_Setup(wrk->busyobj->bereq, wrk->ws);
http_FilterHeader(sp, HTTPH_R_PIPE);
@@ -1420,7 +1420,7 @@ cnt_pipe(struct sess *sp)
PipeSession(sp);
assert(WRW_IsReleased(wrk));
http_Setup(wrk->busyobj->bereq, NULL);
- VBE_DerefBusyObj(wrk, &wrk->busyobj);
+ VBO_DerefBusyObj(wrk, &wrk->busyobj);
sp->step = STP_DONE;
return (0);
}
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 8a73f6c..675afea 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -452,7 +452,7 @@ HSH_Lookup(struct sess *sp, struct objhead **poh)
oc->refcnt = 1;
AZ(wrk->busyobj);
- wrk->busyobj = VBE_GetBusyObj(wrk);
+ wrk->busyobj = VBO_GetBusyObj(wrk);
VRY_Validate(sp->vary_b);
if (sp->vary_l != NULL)
diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c
index fbe7624..a10b0fe 100644
--- a/bin/varnishd/cache/cache_main.c
+++ b/bin/varnishd/cache/cache_main.c
@@ -117,7 +117,7 @@ child_main(void)
HTTP_Init();
- VBE_Init();
+ VBO_Init();
VBE_InitCfg();
VBP_Init();
WRK_Init();
More information about the varnish-commit
mailing list