[experimental-ims] 59c6ae4 Join struct vbo and struct busyobj
Poul-Henning Kamp
phk at FreeBSD.org
Thu Dec 18 10:27:40 CET 2014
commit 59c6ae45f801a0f447d9f9647f2963950083c696
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Mar 12 08:57:38 2012 +0000
Join struct vbo and struct busyobj
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 2bae6b4..48bdac0 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -108,7 +108,6 @@ struct poolparam;
struct sess;
struct sesspool;
struct vbc;
-struct vbo;
struct vef_priv;
struct vrt_backend;
struct vsb;
@@ -298,7 +297,7 @@ struct worker {
struct objhead *nobjhead;
struct objcore *nobjcore;
struct waitinglist *nwaitinglist;
- struct vbo *nvbo;
+ struct busyobj *nbo;
void *nhashpriv;
struct dstat stats;
@@ -459,7 +458,14 @@ enum busyobj_state_e {
struct busyobj {
unsigned magic;
#define BUSYOBJ_MAGIC 0x23b95567
- struct vbo *vbo;
+ struct lock mtx;
+ char *end;
+
+ /*
+ * All fields from refcount and down are zeroed when the busyobj
+ * is recycled.
+ */
+ unsigned refcount;
uint8_t *vary;
unsigned is_gzip;
@@ -479,7 +485,7 @@ struct busyobj {
struct http_conn htc;
enum body_status body_status;
- struct pool_task task;
+ struct pool_task fetch_task;
struct vef_priv *vef_priv;
@@ -721,7 +727,7 @@ void VBO_Init(void);
struct busyobj *VBO_GetBusyObj(struct worker *wrk);
void VBO_RefBusyObj(const struct busyobj *busyobj);
void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj);
-void VBO_Free(struct vbo **vbo);
+void VBO_Free(struct busyobj **vbo);
/* cache_center.c [CNT] */
void CNT_Session(struct sess *sp);
diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
index 32ae7c8..601272f 100644
--- a/bin/varnishd/cache/cache_busyobj.c
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -40,15 +40,6 @@
static struct mempool *vbopool;
-struct vbo {
- unsigned magic;
-#define VBO_MAGIC 0xde3d8223
- struct lock mtx;
- unsigned refcount;
- char *end;
- struct busyobj bo;
-};
-
/*--------------------------------------------------------------------
*/
@@ -56,7 +47,7 @@ void
VBO_Init(void)
{
- vbopool = MPL_New("vbo", &cache_param->vbo_pool,
+ vbopool = MPL_New("busyobj", &cache_param->vbo_pool,
&cache_param->workspace_backend);
AN(vbopool);
}
@@ -65,88 +56,86 @@ VBO_Init(void)
* BusyObj handling
*/
-static struct vbo *
+static struct busyobj *
vbo_New(void)
{
- struct vbo *vbo;
+ struct busyobj *bo;
unsigned sz;
- vbo = MPL_Get(vbopool, &sz);
- AN(vbo);
- vbo->magic = VBO_MAGIC;
- vbo->end = (char *)vbo + sz;
- Lck_New(&vbo->mtx, lck_busyobj);
- return (vbo);
+ bo = MPL_Get(vbopool, &sz);
+ XXXAN(bo);
+ bo->magic = BUSYOBJ_MAGIC;
+ bo->end = (char *)bo + sz;
+ Lck_New(&bo->mtx, lck_busyobj);
+ return (bo);
}
void
-VBO_Free(struct vbo **vbop)
+VBO_Free(struct busyobj **bop)
{
- struct vbo *vbo;
+ struct busyobj *bo;
- AN(vbop);
- vbo = *vbop;
- *vbop = NULL;
- CHECK_OBJ_NOTNULL(vbo, VBO_MAGIC);
- AZ(vbo->refcount);
- Lck_Delete(&vbo->mtx);
- MPL_Free(vbopool, vbo);
+ AN(bop);
+ bo = *bop;
+ *bop = NULL;
+ CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+ AZ(bo->refcount);
+ Lck_Delete(&bo->mtx);
+ MPL_Free(vbopool, bo);
}
struct busyobj *
VBO_GetBusyObj(struct worker *wrk)
{
- struct vbo *vbo = NULL;
+ struct busyobj *bo = NULL;
uint16_t nhttp;
unsigned sz;
char *p;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
- if (wrk->nvbo != NULL) {
- vbo = wrk->nvbo;
- wrk->nvbo = NULL;
+ if (wrk->nbo != NULL) {
+ bo = wrk->nbo;
+ wrk->nbo = NULL;
}
- if (vbo == NULL)
- vbo = vbo_New();
+ if (bo == NULL)
+ bo = vbo_New();
- CHECK_OBJ_NOTNULL(vbo, VBO_MAGIC);
- AZ(vbo->refcount);
+ CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+ AZ(bo->refcount);
- AZ(vbo->bo.magic);
- vbo->refcount = 1;
- vbo->bo.magic = BUSYOBJ_MAGIC;
- vbo->bo.vbo = vbo;
+ bo->refcount = 1;
- p = (void*)(vbo + 1);
+ p = (void*)(bo + 1);
p = (void*)PRNDUP(p);
- assert(p < vbo->end);
+ assert(p < bo->end);
nhttp = (uint16_t)cache_param->http_max_hdr;
sz = HTTP_estimate(nhttp);
- vbo->bo.bereq = HTTP_create(p, nhttp);
+ bo->bereq = HTTP_create(p, nhttp);
p += sz;
p = (void*)PRNDUP(p);
- assert(p < vbo->end);
+ assert(p < bo->end);
- vbo->bo.beresp = HTTP_create(p, nhttp);
+ bo->beresp = HTTP_create(p, nhttp);
p += sz;
p = (void*)PRNDUP(p);
- assert(p < vbo->end);
+ assert(p < bo->end);
sz = cache_param->vsl_buffer;
- VSL_Setup(vbo->bo.vsl, p, sz);
+ VSL_Setup(bo->vsl, p, sz);
p += sz;
p = (void*)PRNDUP(p);
- assert(p < vbo->end);
+ assert(p < bo->end);
- WS_Init(vbo->bo.ws, "bo", p, vbo->end - p);
+ WS_Init(bo->ws, "bo", p, bo->end - p);
- return (&vbo->bo);
+ return (bo);
}
+#if 0
void
VBO_RefBusyObj(const struct busyobj *busyobj)
{
@@ -160,12 +149,12 @@ VBO_RefBusyObj(const struct busyobj *busyobj)
vbo->refcount++;
Lck_Unlock(&vbo->mtx);
}
+#endif
void
VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
{
struct busyobj *bo;
- struct vbo *vbo;
unsigned r;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
@@ -173,22 +162,21 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
bo = *pbo;
*pbo = NULL;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
- vbo = bo->vbo;
- CHECK_OBJ_NOTNULL(vbo, VBO_MAGIC);
- Lck_Lock(&vbo->mtx);
- assert(vbo->refcount > 0);
- r = --vbo->refcount;
- Lck_Unlock(&vbo->mtx);
+ Lck_Lock(&bo->mtx);
+ assert(bo->refcount > 0);
+ r = --bo->refcount;
+ Lck_Unlock(&bo->mtx);
if (r)
return;
- VSL_Flush(vbo->bo.vsl, 0);
- /* XXX: Sanity checks & cleanup */
- memset(&vbo->bo, 0, sizeof vbo->bo);
+ VSL_Flush(bo->vsl, 0);
+
+ memset(&bo->refcount, 0,
+ sizeof *bo - offsetof(struct busyobj, refcount));
- if (cache_param->bo_cache && wrk->nvbo == NULL)
- wrk->nvbo = vbo;
+ if (cache_param->bo_cache && wrk->nbo == NULL)
+ wrk->nbo = bo;
else
- VBO_Free(&vbo);
+ VBO_Free(&bo);
}
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index ecea4b5..1ae5dd7 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -906,9 +906,9 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
#if 1
FetchBody(wrk, bo);
#else
- bo->task.func = FetchBody;
- bo->task.priv = bo;
- if (Pool_Task(wrk->pool, &bo->task, POOL_NO_QUEUE)) {
+ bo->fetch_task.func = FetchBody;
+ bo->fetch_task.priv = bo;
+ if (Pool_Task(wrk->pool, &bo->fetch_task, POOL_NO_QUEUE)) {
FetchBody(wrk, bo);
} else {
while (bo->state < BOS_FAILED)
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 1e21214..951cef9 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -131,8 +131,6 @@ HSH_Cleanup(struct worker *wrk)
free(wrk->nhashpriv);
wrk->nhashpriv = NULL;
}
- if (wrk->nvbo != NULL)
- VBO_Free(&wrk->nvbo);
}
void
diff --git a/bin/varnishd/cache/cache_wrk.c b/bin/varnishd/cache/cache_wrk.c
index cc3a061..7b65479 100644
--- a/bin/varnishd/cache/cache_wrk.c
+++ b/bin/varnishd/cache/cache_wrk.c
@@ -147,8 +147,8 @@ wrk_thread_real(void *priv, unsigned thread_workspace)
if (w->vcl != NULL)
VCL_Rel(&w->vcl);
AZ(pthread_cond_destroy(&w->cond));
- if (w->nvbo != NULL)
- VBO_Free(&w->nvbo);
+ if (w->nbo != NULL)
+ VBO_Free(&w->nbo);
HSH_Cleanup(w);
WRK_SumStat(w);
return (NULL);
More information about the varnish-commit
mailing list