[master] ee3b325 Eliminate the objcore** arg from STV_MkObject() by putting it in busyobj.

Poul-Henning Kamp phk at varnish-cache.org
Wed May 22 22:42:21 CEST 2013


commit ee3b325eecbf3675ef649eea132f3816019a815b
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed May 22 20:41:35 2013 +0000

    Eliminate the objcore** arg from STV_MkObject() by putting it in busyobj.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 8907097..64f1eee 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -516,6 +516,7 @@ struct busyobj {
 	struct vbc		*vbc;
 	struct http		*bereq;
 	struct http		*beresp;
+	struct objcore		*fetch_objcore;
 	struct object		*fetch_obj;
 	uint8_t			digest[DIGEST_LEN];
 	struct exp		exp;
@@ -1080,7 +1081,7 @@ unsigned RFC2616_Req_Gzip(const struct http *);
 int RFC2616_Do_Cond(const struct req *sp);
 
 /* stevedore.c */
-struct object *STV_NewObject(struct busyobj *, struct objcore **,
+struct object *STV_NewObject(struct busyobj *,
     const char *hint, unsigned len, uint16_t nhttp);
 struct storage *STV_alloc(struct busyobj *, size_t size);
 void STV_trim(struct storage *st, size_t size, int move_ok);
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 369ed21..66a7c72 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -637,8 +637,8 @@ vbf_make_bereq(struct worker *wrk, const struct req *req, struct busyobj *bo)
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
-	CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+	CHECK_OBJ_NOTNULL(bo->fetch_objcore, OBJCORE_MAGIC);
 
 	AN(bo->director);
 	AZ(bo->vbc);
@@ -694,7 +694,7 @@ cnt_fetch(struct worker *wrk, struct req *req, struct busyobj *bo)
 		i = FetchHdr(wrk, bo, bo->do_pass ? req : NULL);
 	}
 
-	if (req->objcore->objhead != NULL)
+	if (bo->fetch_objcore->objhead != NULL)
 		(void)HTTP1_DiscardReqBody(req);	// XXX
 
 	if (!i) {
@@ -723,7 +723,7 @@ cnt_fetch(struct worker *wrk, struct req *req, struct busyobj *bo)
 		RFC2616_Ttl(bo);
 
 		/* pass from vclrecv{} has negative TTL */
-		if (req->objcore->objhead == NULL)
+		if (bo->fetch_objcore->objhead == NULL)
 			bo->exp.ttl = -1.;
 
 		AZ(bo->do_esi);
@@ -735,7 +735,7 @@ cnt_fetch(struct worker *wrk, struct req *req, struct busyobj *bo)
 		bo->do_pass |= i;
 
 		if (bo->do_pass)
-			req->objcore->flags |= OC_F_PASS;
+			bo->fetch_objcore->flags |= OC_F_PASS;
 
 		if (wrk->handling == VCL_RET_DELIVER)
 			return (0);
@@ -750,12 +750,13 @@ cnt_fetch(struct worker *wrk, struct req *req, struct busyobj *bo)
 	/* Clean up partial fetch */
 	AZ(bo->vbc);
 
-	if (req->objcore->objhead != NULL ||
+	if (bo->fetch_objcore->objhead != NULL ||
 	    wrk->handling == VCL_RET_RESTART ||
 	    wrk->handling == VCL_RET_ERROR) {
-		CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
+		CHECK_OBJ_NOTNULL(bo->fetch_objcore, OBJCORE_MAGIC);
 		AZ(HSH_Deref(&wrk->stats, req->objcore, NULL));
 		req->objcore = NULL;
+		bo->fetch_objcore = NULL;
 	}
 	assert(bo->refcount == 2);
 	bo->storage_hint = NULL;
@@ -793,6 +794,8 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 	xxxassert(bo->refcount == 2);	// Req might abandon early ?
 	CHECK_OBJ_NOTNULL(bo->vcl, VCL_CONF_MAGIC);
 
+	bo->fetch_objcore = req->objcore;
+
 	vbf_make_bereq(wrk, req, bo);
 	xxxassert (wrk->handling == VCL_RET_FETCH);
 
@@ -800,7 +803,7 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 	if (i)
 		return (i);
 
-	if (req->objcore->objhead == NULL) {
+	if (bo->fetch_objcore->objhead == NULL) {
 		AN(bo->do_pass);
 		/* This is a pass from vcl_recv */
 		bo->do_pass = 1;
@@ -874,7 +877,7 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 	    bo->do_pass ? HTTPH_R_PASS : HTTPH_A_INS, &nhttp);
 
 	/* Create Vary instructions */
-	if (req->objcore->objhead != NULL) {
+	if (bo->fetch_objcore->objhead != NULL) {
 		varyl = VRY_Create(bo, &vary);
 		if (varyl > 0) {
 			AN(vary);
@@ -885,6 +888,7 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 			AZ(vary);
 			AZ(HSH_Deref(&wrk->stats, req->objcore, NULL));
 			req->objcore = NULL;
+			bo->fetch_objcore = NULL;
 			VDI_CloseFd(&bo->vbc);
 			return (-1);
 		} else
@@ -903,8 +907,7 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 
 	AZ(bo->stats);
 	bo->stats = &wrk->stats;
-	req->obj = STV_NewObject(bo, &req->objcore, bo->storage_hint, l,
-	    nhttp);
+	req->obj = STV_NewObject(bo, bo->storage_hint, l, nhttp);
 	if (req->obj == NULL) {
 		/*
 		 * Try to salvage the transaction by allocating a
@@ -914,18 +917,19 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 			bo->exp.ttl = cache_param->shortlived;
 		bo->exp.grace = 0.0;
 		bo->exp.keep = 0.0;
-		req->obj = STV_NewObject(bo, &req->objcore, TRANSIENT_STORAGE,
-		    l, nhttp);
+		req->obj = STV_NewObject(bo, TRANSIENT_STORAGE, l, nhttp);
 	}
 	bo->stats = NULL;
 	if (req->obj == NULL) {
 		AZ(HSH_Deref(&wrk->stats, req->objcore, NULL));
 		req->objcore = NULL;
+		bo->fetch_objcore = NULL;
 		VDI_CloseFd(&bo->vbc);
 		return (-1);
 	}
 	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 
+	req->objcore = NULL;
 	bo->storage_hint = NULL;
 
 	AZ(bo->fetch_obj);
@@ -974,8 +978,6 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 	/*
 	 * Ready to fetch the body
 	 */
-	bo->fetch_task.func = FetchBody;
-	bo->fetch_task.priv = bo;
 
 	assert(bo->refcount == 2);	/* one for each thread */
 
@@ -986,9 +988,7 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 		HSH_Unbusy(&wrk->stats, req->obj->objcore);
 	}
 
-	if (!bo->do_stream ||
-	    Pool_Task(wrk->pool, &bo->fetch_task, POOL_NO_QUEUE))
-		FetchBody(wrk, bo);
+	FetchBody(wrk, bo);
 
 	if (req->obj->objcore->objhead != NULL)
 		HSH_Ref(req->obj->objcore);
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index d8ba776..e789ffe 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -273,16 +273,16 @@ cnt_error(struct worker *wrk, struct req *req)
 	req->busyobj = bo;
 	AZ(bo->stats);
 	bo->stats = &wrk->stats;
-	req->objcore = HSH_NewObjCore(wrk);
-	req->obj = STV_NewObject(bo, &req->objcore,
+	bo->fetch_objcore = HSH_NewObjCore(wrk);
+	req->obj = STV_NewObject(bo,
 	    TRANSIENT_STORAGE, cache_param->http_resp_size,
 	    (uint16_t)cache_param->http_max_hdr);
 	bo->stats = NULL;
 	if (req->obj == NULL) {
 		req->doclose = SC_OVERLOAD;
 		req->director = NULL;
-		AZ(HSH_Deref(&wrk->stats, req->objcore, NULL));
-		req->objcore = NULL;
+		AZ(HSH_Deref(&wrk->stats, bo->fetch_objcore, NULL));
+		bo->fetch_objcore = NULL;
 		http_Teardown(bo->beresp);
 		http_Teardown(bo->bereq);
 		VBO_DerefBusyObj(wrk, &req->busyobj);
@@ -291,6 +291,7 @@ cnt_error(struct worker *wrk, struct req *req)
 	}
 	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 	AZ(req->objcore);
+	AZ(bo->fetch_objcore);
 	req->obj->vxid = bo->vsl->wid;
 	req->obj->exp.entered = req->t_req;
 
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index fa0fdcf..407470e 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -252,7 +252,7 @@ struct stv_objsecrets {
  */
 
 struct object *
-STV_MkObject(struct stevedore *stv, struct busyobj *bo, struct objcore **ocp,
+STV_MkObject(struct stevedore *stv, struct busyobj *bo,
     void *ptr, unsigned ltot, const struct stv_objsecrets *soc)
 {
 	struct object *o;
@@ -261,8 +261,7 @@ STV_MkObject(struct stevedore *stv, struct busyobj *bo, struct objcore **ocp,
 	CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	CHECK_OBJ_NOTNULL(soc, STV_OBJ_SECRETES_MAGIC);
-	AN(ocp);
-	CHECK_OBJ_NOTNULL((*ocp), OBJCORE_MAGIC);
+	CHECK_OBJ_NOTNULL(bo->fetch_objcore, OBJCORE_MAGIC);
 
 	assert(PAOK(ptr));
 	assert(PAOK(soc->wsl));
@@ -288,8 +287,8 @@ STV_MkObject(struct stevedore *stv, struct busyobj *bo, struct objcore **ocp,
 	VTAILQ_INIT(&o->store);
 	bo->stats->n_object++;
 
-	o->objcore = *ocp;
-	*ocp = NULL;     /* refcnt follows pointer. */
+	o->objcore = bo->fetch_objcore;
+	bo->fetch_objcore = NULL;     /* refcnt follows pointer. */
 	if (o->objcore->objhead != NULL)
 		BAN_NewObjCore(o->objcore);
 
@@ -306,14 +305,13 @@ STV_MkObject(struct stevedore *stv, struct busyobj *bo, struct objcore **ocp,
 
 struct object *
 stv_default_allocobj(struct stevedore *stv, struct busyobj *bo,
-    struct objcore **ocp, unsigned ltot, const struct stv_objsecrets *soc)
+    unsigned ltot, const struct stv_objsecrets *soc)
 {
 	struct object *o;
 	struct storage *st;
 
 	CHECK_OBJ_NOTNULL(soc, STV_OBJ_SECRETES_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
-	AN(ocp);
 	st = stv->alloc(stv, ltot);
 	if (st == NULL)
 		return (NULL);
@@ -322,7 +320,7 @@ stv_default_allocobj(struct stevedore *stv, struct busyobj *bo,
 		return (NULL);
 	}
 	ltot = st->len = st->space;
-	o = STV_MkObject(stv, bo, ocp, st->ptr, ltot, soc);
+	o = STV_MkObject(stv, bo, st->ptr, ltot, soc);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	o->objstore = st;
 	return (o);
@@ -335,7 +333,7 @@ stv_default_allocobj(struct stevedore *stv, struct busyobj *bo,
  */
 
 struct object *
-STV_NewObject(struct busyobj *bo, struct objcore **ocp, const char *hint,
+STV_NewObject(struct busyobj *bo, const char *hint,
     unsigned wsl, uint16_t nhttp)
 {
 	struct object *o;
@@ -345,7 +343,6 @@ STV_NewObject(struct busyobj *bo, struct objcore **ocp, const char *hint,
 	int i;
 
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
-	AN(ocp);
 	assert(wsl > 0);
 	wsl = PRNDUP(wsl);
 
@@ -362,12 +359,12 @@ STV_NewObject(struct busyobj *bo, struct objcore **ocp, const char *hint,
 
 	stv = stv0 = stv_pick_stevedore(bo->vsl, &hint);
 	AN(stv->allocobj);
-	o = stv->allocobj(stv, bo, ocp, ltot, &soc);
+	o = stv->allocobj(stv, bo, ltot, &soc);
 	if (o == NULL && hint == NULL) {
 		do {
 			stv = stv_pick_stevedore(bo->vsl, &hint);
 			AN(stv->allocobj);
-			o = stv->allocobj(stv, bo, ocp, ltot, &soc);
+			o = stv->allocobj(stv, bo, ltot, &soc);
 		} while (o == NULL && stv != stv0);
 	}
 	if (o == NULL) {
@@ -375,15 +372,13 @@ STV_NewObject(struct busyobj *bo, struct objcore **ocp, const char *hint,
 		for (i = 0; o == NULL && i < cache_param->nuke_limit; i++) {
 			if (EXP_NukeOne(bo, stv->lru) == -1)
 				break;
-			o = stv->allocobj(stv, bo, ocp, ltot, &soc);
+			o = stv->allocobj(stv, bo, ltot, &soc);
 		}
 	}
 
 	if (o == NULL) {
-		AN(*ocp);
 		return (NULL);
 	}
-	AZ(*ocp);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	CHECK_OBJ_NOTNULL(o->objstore, STORAGE_MAGIC);
 	return (o);
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index be6078b..47fabad 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -45,7 +45,7 @@ typedef struct storage *storage_alloc_f(struct stevedore *, size_t size);
 typedef void storage_trim_f(struct storage *, size_t size, int move_ok);
 typedef void storage_free_f(struct storage *);
 typedef struct object *storage_allocobj_f(struct stevedore *, struct busyobj *,
-    struct objcore **, unsigned ltot, const struct stv_objsecrets *);
+    unsigned ltot, const struct stv_objsecrets *);
 typedef void storage_close_f(const struct stevedore *);
 typedef void storage_signal_close_f(const struct stevedore *);
 typedef int storage_baninfo_f(const struct stevedore *, enum baninfo event,
@@ -101,8 +101,7 @@ int STV_GetFile(const char *fn, int *fdp, const char **fnp, const char *ctx);
 uintmax_t STV_FileSize(int fd, const char *size, unsigned *granularity,
     const char *ctx);
 struct object *STV_MkObject(struct stevedore *stv, struct busyobj *bo,
-    struct objcore **ocp, void *ptr, unsigned ltot,
-    const struct stv_objsecrets *soc);
+    void *ptr, unsigned ltot, const struct stv_objsecrets *soc);
 
 struct lru *LRU_Alloc(void);
 void LRU_Free(struct lru *lru);
diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c
index 55279c8..6c7f015 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -506,7 +506,7 @@ smp_allocx(struct stevedore *st, size_t min_size, size_t max_size,
  */
 
 static struct object *
-smp_allocobj(struct stevedore *stv, struct busyobj *bo, struct objcore **ocp,
+smp_allocobj(struct stevedore *stv, struct busyobj *bo, 
     unsigned ltot, const struct stv_objsecrets *soc)
 {
 	struct object *o;
@@ -517,8 +517,8 @@ smp_allocobj(struct stevedore *stv, struct busyobj *bo, struct objcore **ocp,
 	struct objcore *oc;
 	unsigned objidx;
 
-	AN(ocp);
-	if (*ocp == NULL)
+	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+	if (bo->fetch_objcore == NULL)
 		return (NULL);		/* from cnt_error */
 	CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC);
 	AN(bo->exp.ttl > 0.);
@@ -532,7 +532,7 @@ smp_allocobj(struct stevedore *stv, struct busyobj *bo, struct objcore **ocp,
 	assert(st->space >= ltot);
 	ltot = st->len = st->space;
 
-	o = STV_MkObject(stv, bo, ocp, st->ptr, ltot, soc);
+	o = STV_MkObject(stv, bo, st->ptr, ltot, soc);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	o->objstore = st;
 



More information about the varnish-commit mailing list