[master] 6c14864 move obj and objcore from worker to req

Poul-Henning Kamp phk at varnish-cache.org
Mon Dec 26 11:03:07 CET 2011


commit 6c148642883f466b15281ad8799ecbce23c3954b
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Dec 26 10:02:54 2011 +0000

    move obj and objcore from worker to req

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index c919b32..71b2c83 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -329,8 +329,6 @@ struct worker {
 
 	struct ws		ws[1];
 
-	struct object		*obj;
-	struct objcore		*objcore;
 	struct busyobj		*busyobj;
 
 	/* This is only here so VRT can find it */
@@ -622,6 +620,8 @@ struct req {
 	struct http		*resp;
 
 	struct ws		ws[1];
+	struct object		*obj;
+	struct objcore		*objcore;
 };
 
 /*--------------------------------------------------------------------*/
diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 24aedb4..b683300 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -227,7 +227,7 @@ vbe_NewConn(void)
 
 /*--------------------------------------------------------------------
  * It evaluates if a backend is healthy _for_a_specific_object_.
- * That means that it relies on sp->wrk->objcore->objhead. This is mainly for
+ * That means that it relies on sp->req->objcore->objhead. This is mainly for
  * saint-mode, but also takes backend->healthy into account. If
  * cache_param->saintmode_threshold is 0, this is basically just a test of
  * backend->healthy.
@@ -274,11 +274,11 @@ vbe_Healthy(const struct vdi_simple *vs, const struct sess *sp)
 	if (threshold == 0)
 		return (1);
 
-	if (sp->wrk->objcore == NULL)
+	if (sp->req->objcore == NULL)
 		return (1);
 
 	now = sp->t_req;
-	target = (uintptr_t)(sp->wrk->objcore->objhead);
+	target = (uintptr_t)(sp->req->objcore->objhead);
 
 	old = NULL;
 	retval = 1;
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index 298b7b4..8ee4470 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -115,7 +115,7 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req)
 	}
 
 	AZ(req->vcl);
-	AZ(wrk->obj);
+	AZ(req->obj);
 	AZ(req->esi_level);
 	assert(req->xid == 0);
 	req->t_resp = NAN;
@@ -213,13 +213,13 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 
-	CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC);
+	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 	CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
 
 	if (wrk->busyobj != NULL) {
 		CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
 		AN(wrk->busyobj->do_stream);
-		AssertObjCorePassOrBusy(wrk->obj->objcore);
+		AssertObjCorePassOrBusy(req->obj->objcore);
 	}
 
 	wrk->res_mode = 0;
@@ -233,7 +233,7 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req)
 	    !wrk->busyobj->do_gzip && !wrk->busyobj->do_gunzip)
 		wrk->res_mode |= RES_LEN;
 
-	if (!req->disable_esi && wrk->obj->esidata != NULL) {
+	if (!req->disable_esi && req->obj->esidata != NULL) {
 		/* In ESI mode, we don't know the aggregate length */
 		wrk->res_mode &= ~RES_LEN;
 		wrk->res_mode |= RES_ESI;
@@ -244,7 +244,7 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req)
 		wrk->res_mode |= RES_ESI_CHILD;
 	}
 
-	if (cache_param->http_gzip_support && wrk->obj->gziped &&
+	if (cache_param->http_gzip_support && req->obj->gziped &&
 	    !RFC2616_Req_Gzip(sp)) {
 		/*
 		 * We don't know what it uncompresses to
@@ -255,7 +255,7 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req)
 	}
 
 	if (!(wrk->res_mode & (RES_LEN|RES_CHUNKED|RES_EOF))) {
-		if (wrk->obj->len == 0 &&
+		if (req->obj->len == 0 &&
 		    (wrk->busyobj == NULL || !wrk->busyobj->do_stream))
 			/*
 			 * If the object is empty, neither ESI nor GUNZIP
@@ -273,12 +273,12 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req)
 	}
 
 	req->t_resp = W_TIM_real(wrk);
-	if (wrk->obj->objcore != NULL) {
-		if ((req->t_resp - wrk->obj->last_lru) >
+	if (req->obj->objcore != NULL) {
+		if ((req->t_resp - req->obj->last_lru) >
 		    cache_param->lru_timeout &&
-		    EXP_Touch(wrk->obj->objcore))
-			wrk->obj->last_lru = req->t_resp;
-		wrk->obj->last_use = req->t_resp;	/* XXX: locking ? */
+		    EXP_Touch(req->obj->objcore))
+			req->obj->last_lru = req->t_resp;
+		req->obj->last_use = req->t_resp;	/* XXX: locking ? */
 	}
 	http_Setup(req->resp, req->ws);
 	RES_BuildHttp(sp);
@@ -295,9 +295,9 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req)
 			HSH_Drop(wrk);
 			VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		} else {
-			(void)HSH_Deref(wrk, NULL, &wrk->obj);
+			(void)HSH_Deref(wrk, NULL, &req->obj);
 		}
-		AZ(wrk->obj);
+		AZ(req->obj);
 		req->restarts++;
 		req->director = NULL;
 		http_Setup(req->resp, NULL);
@@ -307,7 +307,7 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req)
 		WRONG("Illegal action in vcl_deliver{}");
 	}
 	if (wrk->busyobj != NULL && wrk->busyobj->do_stream) {
-		AssertObjCorePassOrBusy(wrk->obj->objcore);
+		AssertObjCorePassOrBusy(req->obj->objcore);
 		sp->step = STP_STREAMBODY;
 	} else {
 		sp->step = STP_DELIVER;
@@ -345,7 +345,7 @@ cnt_deliver(struct sess *sp, struct worker *wrk, struct req *req)
 
 	assert(WRW_IsReleased(wrk));
 	assert(wrk->wrw.ciov == wrk->wrw.siov);
-	(void)HSH_Deref(wrk, NULL, &wrk->obj);
+	(void)HSH_Deref(wrk, NULL, &req->obj);
 	http_Setup(req->resp, NULL);
 	sp->step = STP_DONE;
 	return (0);
@@ -376,7 +376,7 @@ cnt_done(struct sess *sp, struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	CHECK_OBJ_ORNULL(req->vcl, VCL_CONF_MAGIC);
 
-	AZ(wrk->obj);
+	AZ(req->obj);
 	AZ(wrk->busyobj);
 	req->director = NULL;
 	req->restarts = 0;
@@ -484,17 +484,17 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 
-	if (wrk->obj == NULL) {
+	if (req->obj == NULL) {
 		HSH_Prealloc(sp);
 		AZ(wrk->busyobj);
 		wrk->busyobj = VBO_GetBusyObj(wrk);
-		wrk->obj = STV_NewObject(wrk, NULL, cache_param->http_resp_size,
+		req->obj = STV_NewObject(wrk, NULL, cache_param->http_resp_size,
 		     (uint16_t)cache_param->http_max_hdr);
-		if (wrk->obj == NULL)
-			wrk->obj = STV_NewObject(wrk, TRANSIENT_STORAGE,
+		if (req->obj == NULL)
+			req->obj = STV_NewObject(wrk, TRANSIENT_STORAGE,
 			    cache_param->http_resp_size,
 			    (uint16_t)cache_param->http_max_hdr);
-		if (wrk->obj == NULL) {
+		if (req->obj == NULL) {
 			req->doclose = "Out of objects";
 			req->director = NULL;
 			http_Setup(wrk->busyobj->beresp, NULL);
@@ -502,15 +502,15 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req)
 			sp->step = STP_DONE;
 			return(0);
 		}
-		AN(wrk->obj);
-		wrk->obj->xid = req->xid;
-		wrk->obj->exp.entered = sp->t_req;
+		AN(req->obj);
+		req->obj->xid = req->xid;
+		req->obj->exp.entered = sp->t_req;
 	} else {
 		CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
 		/* XXX: Null the headers ? */
 	}
-	CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC);
-	h = wrk->obj->http;
+	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
+	h = req->obj->http;
 
 	if (req->err_code < 100 || req->err_code > 999)
 		req->err_code = 501;
@@ -643,7 +643,7 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req)
 		RFC2616_Ttl(sp);
 
 		/* pass from vclrecv{} has negative TTL */
-		if (wrk->objcore == NULL)
+		if (req->objcore == NULL)
 			wrk->busyobj->exp.ttl = -1.;
 
 		AZ(wrk->busyobj->do_esi);
@@ -652,12 +652,12 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req)
 
 		switch (req->handling) {
 		case VCL_RET_HIT_FOR_PASS:
-			if (wrk->objcore != NULL)
-				wrk->objcore->flags |= OC_F_PASS;
+			if (req->objcore != NULL)
+				req->objcore->flags |= OC_F_PASS;
 			sp->step = STP_FETCHBODY;
 			return (0);
 		case VCL_RET_DELIVER:
-			AssertObjCorePassOrBusy(wrk->objcore);
+			AssertObjCorePassOrBusy(req->objcore);
 			sp->step = STP_FETCHBODY;
 			return (0);
 		default:
@@ -671,10 +671,10 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req)
 	/* Clean up partial fetch */
 	AZ(wrk->busyobj->vbc);
 
-	if (wrk->objcore != NULL) {
-		CHECK_OBJ_NOTNULL(wrk->objcore, OBJCORE_MAGIC);
-		AZ(HSH_Deref(wrk, wrk->objcore, NULL));
-		wrk->objcore = NULL;
+	if (req->objcore != NULL) {
+		CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
+		AZ(HSH_Deref(wrk, req->objcore, NULL));
+		req->objcore = NULL;
 	}
 	VBO_DerefBusyObj(wrk, &wrk->busyobj);
 	req->director = NULL;
@@ -733,7 +733,7 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
 	assert(req->handling == VCL_RET_HIT_FOR_PASS ||
 	    req->handling == VCL_RET_DELIVER);
 
-	if (wrk->objcore == NULL) {
+	if (req->objcore == NULL) {
 		/* This is a pass from vcl_recv */
 		pass = 1;
 		/* VCL may have fiddled this, but that doesn't help */
@@ -812,8 +812,8 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
 	    pass ? HTTPH_R_PASS : HTTPH_A_INS, &nhttp);
 
 	/* Create Vary instructions */
-	if (wrk->objcore != NULL) {
-		CHECK_OBJ_NOTNULL(wrk->objcore, OBJCORE_MAGIC);
+	if (req->objcore != NULL) {
+		CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
 		vary = VRY_Create(sp, wrk->busyobj->beresp);
 		if (vary != NULL) {
 			varyl = VSB_len(vary);
@@ -829,51 +829,51 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
 	l += strlen("Content-Length: XxxXxxXxxXxxXxxXxx") + sizeof(void *);
 
 	if (wrk->busyobj->exp.ttl < cache_param->shortlived ||
-	    wrk->objcore == NULL)
+	    req->objcore == NULL)
 		wrk->storage_hint = TRANSIENT_STORAGE;
 
-	wrk->obj = STV_NewObject(wrk, wrk->storage_hint, l, nhttp);
-	if (wrk->obj == NULL) {
+	req->obj = STV_NewObject(wrk, wrk->storage_hint, l, nhttp);
+	if (req->obj == NULL) {
 		/*
 		 * Try to salvage the transaction by allocating a
 		 * shortlived object on Transient storage.
 		 */
-		wrk->obj = STV_NewObject(wrk, TRANSIENT_STORAGE, l, nhttp);
+		req->obj = STV_NewObject(wrk, TRANSIENT_STORAGE, l, nhttp);
 		if (wrk->busyobj->exp.ttl > cache_param->shortlived)
 			wrk->busyobj->exp.ttl = cache_param->shortlived;
 		wrk->busyobj->exp.grace = 0.0;
 		wrk->busyobj->exp.keep = 0.0;
 	}
-	if (wrk->obj == NULL) {
+	if (req->obj == NULL) {
 		req->err_code = 503;
 		sp->step = STP_ERROR;
 		VDI_CloseFd(wrk, &wrk->busyobj->vbc);
 		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		return (0);
 	}
-	CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC);
+	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 
 	wrk->storage_hint = NULL;
 
 	if (wrk->busyobj->do_gzip ||
 	    (wrk->busyobj->is_gzip && !wrk->busyobj->do_gunzip))
-		wrk->obj->gziped = 1;
+		req->obj->gziped = 1;
 
 	if (vary != NULL) {
-		wrk->obj->vary = (void *)WS_Alloc(wrk->obj->http->ws, varyl);
-		AN(wrk->obj->vary);
-		memcpy(wrk->obj->vary, VSB_data(vary), varyl);
-		VRY_Validate(wrk->obj->vary);
+		req->obj->vary = (void *)WS_Alloc(req->obj->http->ws, varyl);
+		AN(req->obj->vary);
+		memcpy(req->obj->vary, VSB_data(vary), varyl);
+		VRY_Validate(req->obj->vary);
 		VSB_delete(vary);
 	}
 
-	wrk->obj->xid = req->xid;
-	wrk->obj->response = req->err_code;
-	WS_Assert(wrk->obj->ws_o);
+	req->obj->xid = req->xid;
+	req->obj->response = req->err_code;
+	WS_Assert(req->obj->ws_o);
 
 	/* Filter into object */
 	hp = wrk->busyobj->beresp;
-	hp2 = wrk->obj->http;
+	hp2 = req->obj->http;
 
 	hp2->logtag = HTTP_Obj;
 	http_CopyResp(hp2, hp);
@@ -882,9 +882,9 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
 	http_CopyHome(wrk, sp->vsl_id, hp2);
 
 	if (http_GetHdr(hp, H_Last_Modified, &b))
-		wrk->obj->last_modified = VTIM_parse(b);
+		req->obj->last_modified = VTIM_parse(b);
 	else
-		wrk->obj->last_modified = floor(wrk->busyobj->exp.entered);
+		req->obj->last_modified = floor(wrk->busyobj->exp.entered);
 
 	assert(WRW_IsReleased(wrk));
 
@@ -893,12 +893,12 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
 	 * Notice that vcl_deliver{} could still nuke the headers
 	 * that allow the 304, in which case we return 200 non-stream.
 	 */
-	if (wrk->obj->response == 200 &&
+	if (req->obj->response == 200 &&
 	    req->http->conds &&
 	    RFC2616_Do_Cond(sp))
 		wrk->busyobj->do_stream = 0;
 
-	AssertObjCorePassOrBusy(wrk->obj->objcore);
+	AssertObjCorePassOrBusy(req->obj->objcore);
 
 	if (wrk->busyobj->do_stream) {
 		sp->step = STP_PREPRESP;
@@ -906,7 +906,7 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
 	}
 
 	/* Use unmodified headers*/
-	i = FetchBody(wrk, wrk->obj);
+	i = FetchBody(wrk, req->obj);
 
 	http_Setup(wrk->busyobj->bereq, NULL);
 	http_Setup(wrk->busyobj->beresp, NULL);
@@ -918,16 +918,16 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
 	if (i) {
 		HSH_Drop(wrk);
 		VBO_DerefBusyObj(wrk, &wrk->busyobj);
-		AZ(wrk->obj);
+		AZ(req->obj);
 		req->err_code = 503;
 		sp->step = STP_ERROR;
 		return (0);
 	}
 
-	if (wrk->obj->objcore != NULL) {
-		EXP_Insert(wrk->obj);
-		AN(wrk->obj->objcore);
-		AN(wrk->obj->objcore->ban);
+	if (req->obj->objcore != NULL) {
+		EXP_Insert(req->obj);
+		AN(req->obj->objcore);
+		AN(req->obj->objcore->ban);
 		HSH_Unbusy(wrk);
 	}
 	VBO_DerefBusyObj(wrk, &wrk->busyobj);
@@ -973,9 +973,9 @@ cnt_streambody(struct sess *sp, struct worker *wrk, struct req *req)
 
 	RES_StreamStart(sp);
 
-	AssertObjCorePassOrBusy(wrk->obj->objcore);
+	AssertObjCorePassOrBusy(req->obj->objcore);
 
-	i = FetchBody(wrk, wrk->obj);
+	i = FetchBody(wrk, req->obj);
 
 	http_Setup(wrk->busyobj->bereq, NULL);
 	http_Setup(wrk->busyobj->beresp, NULL);
@@ -983,10 +983,10 @@ cnt_streambody(struct sess *sp, struct worker *wrk, struct req *req)
 	AZ(wrk->busyobj->vbc);
 	AN(req->director);
 
-	if (!i && wrk->obj->objcore != NULL) {
-		EXP_Insert(wrk->obj);
-		AN(wrk->obj->objcore);
-		AN(wrk->obj->objcore->ban);
+	if (!i && req->obj->objcore != NULL) {
+		EXP_Insert(req->obj);
+		AN(req->obj->objcore);
+		AN(req->obj->objcore->ban);
 		HSH_Unbusy(wrk);
 	} else {
 		req->doclose = "Stream error";
@@ -1002,7 +1002,7 @@ cnt_streambody(struct sess *sp, struct worker *wrk, struct req *req)
 	wrk->sctx = NULL;
 	assert(WRW_IsReleased(wrk));
 	assert(wrk->wrw.ciov == wrk->wrw.siov);
-	(void)HSH_Deref(wrk, NULL, &wrk->obj);
+	(void)HSH_Deref(wrk, NULL, &req->obj);
 	VBO_DerefBusyObj(wrk, &wrk->busyobj);
 	http_Setup(req->resp, NULL);
 	sp->step = STP_DONE;
@@ -1075,11 +1075,11 @@ cnt_hit(struct sess *sp, struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 
-	CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC);
+	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 	CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
 	AZ(wrk->busyobj);
 
-	assert(!(wrk->obj->objcore->flags & OC_F_PASS));
+	assert(!(req->obj->objcore->flags & OC_F_PASS));
 
 	VCL_hit_method(sp);
 
@@ -1093,8 +1093,8 @@ cnt_hit(struct sess *sp, struct worker *wrk, struct req *req)
 	}
 
 	/* Drop our object, we won't need it */
-	(void)HSH_Deref(wrk, NULL, &wrk->obj);
-	wrk->objcore = NULL;
+	(void)HSH_Deref(wrk, NULL, &req->obj);
+	req->objcore = NULL;
 
 	switch(req->handling) {
 	case VCL_RET_PASS:
@@ -1200,7 +1200,7 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req)
 		req->vary_l = NULL;
 		req->vary_e = NULL;
 
-		wrk->objcore = oc;
+		req->objcore = oc;
 		CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
 		sp->step = STP_MISS;
 		return (0);
@@ -1208,7 +1208,7 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req)
 
 	o = oc_getobj(wrk, oc);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
-	wrk->obj = o;
+	req->obj = o;
 
 	WS_Release(req->ws, 0);
 	req->vary_b = NULL;
@@ -1217,15 +1217,15 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req)
 
 	if (oc->flags & OC_F_PASS) {
 		wrk->stats.cache_hitpass++;
-		WSP(sp, SLT_HitPass, "%u", wrk->obj->xid);
-		(void)HSH_Deref(wrk, NULL, &wrk->obj);
-		wrk->objcore = NULL;
+		WSP(sp, SLT_HitPass, "%u", req->obj->xid);
+		(void)HSH_Deref(wrk, NULL, &req->obj);
+		req->objcore = NULL;
 		sp->step = STP_PASS;
 		return (0);
 	}
 
 	wrk->stats.cache_hit++;
-	WSP(sp, SLT_Hit, "%u", wrk->obj->xid);
+	WSP(sp, SLT_Hit, "%u", req->obj->xid);
 	sp->step = STP_HIT;
 	return (0);
 }
@@ -1262,8 +1262,8 @@ cnt_miss(struct sess *sp, struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
 
-	AZ(wrk->obj);
-	AN(wrk->objcore);
+	AZ(req->obj);
+	AN(req->objcore);
 	CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
 	WS_Reset(wrk->ws, NULL);
 	wrk->busyobj = VBO_GetBusyObj(wrk);
@@ -1288,15 +1288,15 @@ cnt_miss(struct sess *sp, struct worker *wrk, struct req *req)
 
 	switch(req->handling) {
 	case VCL_RET_ERROR:
-		AZ(HSH_Deref(wrk, wrk->objcore, NULL));
-		wrk->objcore = NULL;
+		AZ(HSH_Deref(wrk, req->objcore, NULL));
+		req->objcore = NULL;
 		http_Setup(wrk->busyobj->bereq, NULL);
 		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;
+		AZ(HSH_Deref(wrk, req->objcore, NULL));
+		req->objcore = NULL;
 		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		sp->step = STP_PASS;
 		return (0);
@@ -1305,8 +1305,8 @@ cnt_miss(struct sess *sp, struct worker *wrk, struct req *req)
 		sp->step = STP_FETCH;
 		return (0);
 	case VCL_RET_RESTART:
-		AZ(HSH_Deref(wrk, wrk->objcore, NULL));
-		wrk->objcore = NULL;
+		AZ(HSH_Deref(wrk, req->objcore, NULL));
+		req->objcore = NULL;
 		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		INCOMPL();
 	default:
@@ -1353,7 +1353,7 @@ cnt_pass(struct sess *sp, struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
-	AZ(wrk->obj);
+	AZ(req->obj);
 	AZ(wrk->busyobj);
 
 	wrk->busyobj = VBO_GetBusyObj(wrk);
@@ -1464,7 +1464,7 @@ cnt_recv(struct sess *sp, struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
-	AZ(wrk->obj);
+	AZ(req->obj);
 	AZ(wrk->busyobj);
 	assert(wrk->wrw.ciov == wrk->wrw.siov);
 
@@ -1562,7 +1562,7 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	AZ(req->restarts);
-	AZ(wrk->obj);
+	AZ(req->obj);
 	AZ(req->vcl);
 	EXP_Clr(&req->exp);
 	AZ(req->esi_level);
@@ -1641,20 +1641,24 @@ static void
 cnt_diag(struct sess *sp, const char *state)
 {
 	void *vcl;
+	void *obj;
 
-	if (sp->req == NULL)
+	if (sp->req == NULL) {
 		vcl = NULL;
-	else
+		obj = NULL;
+	} else {
 		vcl = sp->req->vcl;
+		obj = sp->req->obj;
+	}
 
 	if (sp->wrk != NULL) {
 		WSP(sp, SLT_Debug, "thr %p STP_%s sp %p obj %p vcl %p",
-		    pthread_self(), state, sp, sp->wrk->obj, vcl);
+		    pthread_self(), state, sp, obj, vcl);
 		WSL_Flush(sp->wrk, 0);
 	} else {
 		VSL(SLT_Debug, sp->vsl_id,
 		    "thr %p STP_%s sp %p obj %p vcl %p",
-		    pthread_self(), state, sp, sp->wrk->obj, vcl);
+		    pthread_self(), state, sp, obj, vcl);
 	}
 }
 
@@ -1681,9 +1685,6 @@ CNT_Session(struct sess *sp)
 	    sp->step == STP_LOOKUP ||
 	    sp->step == STP_RECV);
 
-	AZ(wrk->obj);
-	AZ(wrk->objcore);
-
 	/*
 	 * Whenever we come in from the acceptor or waiter, we need to set
 	 * blocking mode, but there is no point in setting it when we come from
@@ -1716,7 +1717,6 @@ CNT_Session(struct sess *sp)
 		 */
 		CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 		CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-		CHECK_OBJ_ORNULL(wrk->obj, OBJECT_MAGIC);
 		CHECK_OBJ_ORNULL(wrk->nobjhead, OBJHEAD_MAGIC);
 		WS_Assert(wrk->ws);
 
@@ -1736,8 +1736,6 @@ CNT_Session(struct sess *sp)
 		CHECK_OBJ_ORNULL(wrk->nobjhead, OBJHEAD_MAGIC);
 	}
 	WSL_Flush(wrk, 0);
-	AZ(wrk->obj);
-	AZ(wrk->objcore);
 #define ACCT(foo)	AZ(wrk->acct_tmp.foo);
 #include "tbl/acct_fields.h"
 #undef ACCT
diff --git a/bin/varnishd/cache/cache_esi_deliver.c b/bin/varnishd/cache/cache_esi_deliver.c
index be8d185..0c58395 100644
--- a/bin/varnishd/cache/cache_esi_deliver.c
+++ b/bin/varnishd/cache/cache_esi_deliver.c
@@ -58,8 +58,8 @@ ved_include(struct sess *sp, const char *src, const char *host)
 
 	(void)WRW_FlushRelease(w);
 
-	obj = sp->wrk->obj;
-	sp->wrk->obj = NULL;
+	obj = sp->req->obj;
+	sp->req->obj = NULL;
 	res_mode = sp->wrk->res_mode;
 
 	/* Reset request to status before we started messing with it */
@@ -106,7 +106,7 @@ ved_include(struct sess *sp, const char *src, const char *host)
 	AN(sp->wrk);
 	assert(sp->step == STP_DONE);
 	sp->req->esi_level--;
-	sp->wrk->obj = obj;
+	sp->req->obj = obj;
 	sp->wrk->res_mode = res_mode;
 
 	/* Reset the workspace */
@@ -231,7 +231,7 @@ ESI_Deliver(struct sess *sp)
 	int i;
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
-	st = sp->wrk->obj->esidata;
+	st = sp->req->obj->esidata;
 	AN(st);
 	assert(sizeof obuf >= 1024);
 
@@ -276,7 +276,7 @@ ESI_Deliver(struct sess *sp)
 		obufl = 0;
 	}
 
-	st = VTAILQ_FIRST(&sp->wrk->obj->store);
+	st = VTAILQ_FIRST(&sp->req->obj->store);
 	off = 0;
 
 	while (p < e) {
@@ -435,7 +435,7 @@ ved_deliver_byterange(const struct sess *sp, ssize_t low, ssize_t high)
 
 //printf("BR %jd %jd\n", low, high);
 	lx = 0;
-	VTAILQ_FOREACH(st, &sp->wrk->obj->store, list) {
+	VTAILQ_FOREACH(st, &sp->req->obj->store, list) {
 		p = st->ptr;
 		l = st->len;
 //printf("[0-] %jd %jd\n", lx, lx + l);
@@ -476,8 +476,8 @@ ESI_DeliverChild(const struct sess *sp)
 	uint32_t ilen;
 	uint8_t *dbits;
 
-	if (!sp->wrk->obj->gziped) {
-		VTAILQ_FOREACH(st, &sp->wrk->obj->store, list)
+	if (!sp->req->obj->gziped) {
+		VTAILQ_FOREACH(st, &sp->req->obj->store, list)
 			ved_pretend_gzip(sp, st->ptr, st->len);
 		return;
 	}
@@ -489,7 +489,7 @@ ESI_DeliverChild(const struct sess *sp)
 
 	dbits = (void*)WS_Alloc(sp->wrk->ws, 8);
 	AN(dbits);
-	obj = sp->wrk->obj;
+	obj = sp->req->obj;
 	CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
 	start = obj->gzip_start;
 	last = obj->gzip_last;
@@ -554,7 +554,7 @@ ESI_DeliverChild(const struct sess *sp)
 	}
 	if (lpad > 0)
 		(void)WRW_Write(sp->wrk, dbits + 1, lpad);
-	st = VTAILQ_LAST(&sp->wrk->obj->store, storagehead);
+	st = VTAILQ_LAST(&sp->req->obj->store, storagehead);
 	assert(st->len > 8);
 
 	p = st->ptr + st->len - 8;
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 2e65591..7070612 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -391,11 +391,11 @@ FetchHdr(struct sess *sp, int need_host_hdr)
 	htc = &wrk->busyobj->htc;
 
 	AN(sp->req->director);
-	AZ(sp->wrk->obj);
+	AZ(sp->req->obj);
 
-	if (sp->wrk->objcore != NULL) {		/* pass has no objcore */
-		CHECK_OBJ_NOTNULL(sp->wrk->objcore, OBJCORE_MAGIC);
-		AN(sp->wrk->objcore->flags & OC_F_BUSY);
+	if (sp->req->objcore != NULL) {		/* pass has no objcore */
+		CHECK_OBJ_NOTNULL(sp->req->objcore, OBJCORE_MAGIC);
+		AN(sp->req->objcore->flags & OC_F_BUSY);
 	}
 
 	hp = wrk->busyobj->bereq;
diff --git a/bin/varnishd/cache/cache_gzip.c b/bin/varnishd/cache/cache_gzip.c
index 061348a..1b732ca 100644
--- a/bin/varnishd/cache/cache_gzip.c
+++ b/bin/varnishd/cache/cache_gzip.c
@@ -248,7 +248,7 @@ VGZ_ObufFull(const struct vgz *vg)
 
 /*--------------------------------------------------------------------
  * Keep the outbuffer supplied with storage and file it under the
- * sp->wrk->obj as it fills.
+ * sp->req->obj as it fills.
  */
 
 int
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 9f2c053..19395d5 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -389,8 +389,8 @@ HSH_Lookup(struct sess *sp, struct objhead **poh)
 	 * XXX: serialize fetch of all Vary's if grace is possible.
 	 */
 
-	AZ(sp->wrk->objcore);
-	sp->wrk->objcore = grace_oc;		/* XXX: Hack-ish */
+	AZ(sp->req->objcore);
+	sp->req->objcore = grace_oc;		/* XXX: Hack-ish */
 	if (oc == NULL			/* We found no live object */
 	    && grace_oc != NULL		/* There is a grace candidate */
 	    && (busy_oc != NULL		/* Somebody else is already busy */
@@ -400,7 +400,7 @@ HSH_Lookup(struct sess *sp, struct objhead **poh)
 		CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 		oc = grace_oc;
 	}
-	sp->wrk->objcore = NULL;
+	sp->req->objcore = NULL;
 
 	if (oc != NULL && !sp->req->hash_always_miss) {
 		o = oc_getobj(sp->wrk, oc);
@@ -580,13 +580,13 @@ HSH_Drop(struct worker *wrk)
 	struct object *o;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	o = wrk->obj;
+	o = wrk->sp->req->obj;
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	AssertObjCorePassOrBusy(o->objcore);
 	o->exp.ttl = -1.;
 	if (o->objcore != NULL)		/* Pass has no objcore */
 		HSH_Unbusy(wrk);
-	(void)HSH_Deref(wrk, NULL, &wrk->obj);
+	(void)HSH_Deref(wrk, NULL, &wrk->sp->req->obj);
 }
 
 void
@@ -597,7 +597,7 @@ HSH_Unbusy(struct worker *wrk)
 	struct objcore *oc;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	o = wrk->obj;
+	o = wrk->sp->req->obj;
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	oc = o->objcore;
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c
index 80f61a4..b09bcb8 100644
--- a/bin/varnishd/cache/cache_panic.c
+++ b/bin/varnishd/cache/cache_panic.c
@@ -274,8 +274,8 @@ pan_sess(const struct sess *sp)
 	if (VALID_OBJ(sp->req->vcl, VCL_CONF_MAGIC))
 		pan_vcl(sp->req->vcl);
 
-	if (VALID_OBJ(sp->wrk->obj, OBJECT_MAGIC))
-		pan_object(sp->wrk->obj);
+	if (VALID_OBJ(sp->req->obj, OBJECT_MAGIC))
+		pan_object(sp->req->obj);
 
 	VSB_printf(pan_vsp, "},\n");
 }
diff --git a/bin/varnishd/cache/cache_response.c b/bin/varnishd/cache/cache_response.c
index 5c10c35..1abb12b 100644
--- a/bin/varnishd/cache/cache_response.c
+++ b/bin/varnishd/cache/cache_response.c
@@ -41,7 +41,7 @@ res_dorange(const struct sess *sp, const char *r, ssize_t *plow, ssize_t *phigh)
 {
 	ssize_t low, high, has_low;
 
-	assert(sp->wrk->obj->response == 200);
+	assert(sp->req->obj->response == 200);
 	if (strncmp(r, "bytes=", 6))
 		return;
 	r += 6;
@@ -57,7 +57,7 @@ res_dorange(const struct sess *sp, const char *r, ssize_t *plow, ssize_t *phigh)
 		r++;
 	}
 
-	if (low >= sp->wrk->obj->len)
+	if (low >= sp->req->obj->len)
 		return;
 
 	if (*r != '-')
@@ -73,23 +73,23 @@ res_dorange(const struct sess *sp, const char *r, ssize_t *plow, ssize_t *phigh)
 			r++;
 		}
 		if (!has_low) {
-			low = sp->wrk->obj->len - high;
-			high = sp->wrk->obj->len - 1;
+			low = sp->req->obj->len - high;
+			high = sp->req->obj->len - 1;
 		}
 	} else
-		high = sp->wrk->obj->len - 1;
+		high = sp->req->obj->len - 1;
 	if (*r != '\0')
 		return;
 
-	if (high >= sp->wrk->obj->len)
-		high = sp->wrk->obj->len - 1;
+	if (high >= sp->req->obj->len)
+		high = sp->req->obj->len - 1;
 
 	if (low > high)
 		return;
 
 	http_PrintfHeader(sp->wrk, sp->vsl_id, sp->req->resp,
 	    "Content-Range: bytes %jd-%jd/%jd",
-	    (intmax_t)low, (intmax_t)high, (intmax_t)sp->wrk->obj->len);
+	    (intmax_t)low, (intmax_t)high, (intmax_t)sp->req->obj->len);
 	http_Unset(sp->req->resp, H_Content_Length);
 	assert(sp->wrk->res_mode & RES_LEN);
 	http_PrintfHeader(sp->wrk, sp->vsl_id, sp->req->resp,
@@ -112,9 +112,9 @@ RES_BuildHttp(const struct sess *sp)
 
 	http_ClrHeader(sp->req->resp);
 	sp->req->resp->logtag = HTTP_Tx;
-	http_CopyResp(sp->req->resp, sp->wrk->obj->http);
+	http_CopyResp(sp->req->resp, sp->req->obj->http);
 	http_FilterFields(sp->wrk, sp->vsl_id, sp->req->resp,
-	    sp->wrk->obj->http, HTTPH_A_DELIVER);
+	    sp->req->obj->http, HTTPH_A_DELIVER);
 
 	if (!(sp->wrk->res_mode & RES_LEN)) {
 		http_Unset(sp->req->resp, H_Content_Length);
@@ -132,15 +132,15 @@ RES_BuildHttp(const struct sess *sp)
 	http_PrintfHeader(sp->wrk, sp->vsl_id, sp->req->resp,
 	    "Date: %s", time_str);
 
-	if (sp->req->xid != sp->wrk->obj->xid)
+	if (sp->req->xid != sp->req->obj->xid)
 		http_PrintfHeader(sp->wrk, sp->vsl_id, sp->req->resp,
-		    "X-Varnish: %u %u", sp->req->xid, sp->wrk->obj->xid);
+		    "X-Varnish: %u %u", sp->req->xid, sp->req->obj->xid);
 	else
 		http_PrintfHeader(sp->wrk, sp->vsl_id, sp->req->resp,
 		    "X-Varnish: %u", sp->req->xid);
 	http_PrintfHeader(sp->wrk, sp->vsl_id, sp->req->resp, "Age: %.0f",
-	    sp->wrk->obj->exp.age + sp->req->t_resp -
-	    sp->wrk->obj->exp.entered);
+	    sp->req->obj->exp.age + sp->req->t_resp -
+	    sp->req->obj->exp.entered);
 	http_SetHeader(sp->wrk, sp->vsl_id, sp->req->resp, "Via: 1.1 varnish");
 	http_PrintfHeader(sp->wrk, sp->vsl_id, sp->req->resp, "Connection: %s",
 	    sp->req->doclose ? "close" : "keep-alive");
@@ -167,7 +167,7 @@ res_WriteGunzipObj(const struct sess *sp)
 	vg = VGZ_NewUngzip(sp->wrk, "U D -");
 
 	VGZ_Obuf(vg, obuf, sizeof obuf);
-	VTAILQ_FOREACH(st, &sp->wrk->obj->store, list) {
+	VTAILQ_FOREACH(st, &sp->req->obj->store, list) {
 		CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 		CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
 		u += st->len;
@@ -185,7 +185,7 @@ res_WriteGunzipObj(const struct sess *sp)
 		(void)WRW_Flush(sp->wrk);
 	}
 	(void)VGZ_Destroy(&vg, sp->vsl_id);
-	assert(u == sp->wrk->obj->len);
+	assert(u == sp->req->obj->len);
 }
 
 /*--------------------------------------------------------------------*/
@@ -200,7 +200,7 @@ res_WriteDirObj(const struct sess *sp, ssize_t low, ssize_t high)
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 
 	ptr = 0;
-	VTAILQ_FOREACH(st, &sp->wrk->obj->store, list) {
+	VTAILQ_FOREACH(st, &sp->req->obj->store, list) {
 		CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 		CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
 		u += st->len;
@@ -241,7 +241,7 @@ res_WriteDirObj(const struct sess *sp, ssize_t low, ssize_t high)
 		VSC_C_main->n_objwrite++;
 		(void)WRW_Write(sp->wrk, st->ptr + off, len);
 	}
-	assert(u == sp->wrk->obj->len);
+	assert(u == sp->req->obj->len);
 }
 
 /*--------------------------------------------------------------------
@@ -259,7 +259,7 @@ RES_WriteObj(struct sess *sp)
 
 	WRW_Reserve(sp->wrk, &sp->fd);
 
-	if (sp->wrk->obj->response == 200 &&
+	if (sp->req->obj->response == 200 &&
 	    sp->req->http->conds &&
 	    RFC2616_Do_Cond(sp)) {
 		sp->req->wantbody = 0;
@@ -272,13 +272,13 @@ RES_WriteObj(struct sess *sp)
 	 * If nothing special planned, we can attempt Range support
 	 */
 	low = 0;
-	high = sp->wrk->obj->len - 1;
+	high = sp->req->obj->len - 1;
 	if (
 	    sp->req->wantbody &&
 	    (sp->wrk->res_mode & RES_LEN) &&
 	    !(sp->wrk->res_mode & (RES_ESI|RES_ESI_CHILD|RES_GUNZIP)) &&
 	    cache_param->http_range_support &&
-	    sp->wrk->obj->response == 200 &&
+	    sp->req->obj->response == 200 &&
 	    http_GetHdr(sp->req->http, H_Range, &r))
 		res_dorange(sp, r, &low, &high);
 
@@ -303,14 +303,14 @@ RES_WriteObj(struct sess *sp)
 
 	if (!sp->req->wantbody) {
 		/* This was a HEAD or conditional request */
-	} else if (sp->wrk->obj->len == 0) {
+	} else if (sp->req->obj->len == 0) {
 		/* Nothing to do here */
 	} else if (sp->wrk->res_mode & RES_ESI) {
 		ESI_Deliver(sp);
 	} else if (sp->wrk->res_mode & RES_ESI_CHILD && sp->wrk->gzip_resp) {
 		ESI_DeliverChild(sp);
 	} else if (sp->wrk->res_mode & RES_ESI_CHILD &&
-	    !sp->wrk->gzip_resp && sp->wrk->obj->gziped) {
+	    !sp->wrk->gzip_resp && sp->req->obj->gziped) {
 		res_WriteGunzipObj(sp);
 	} else if (sp->wrk->res_mode & RES_GUNZIP) {
 		res_WriteGunzipObj(sp);
diff --git a/bin/varnishd/cache/cache_rfc2616.c b/bin/varnishd/cache/cache_rfc2616.c
index 04641ca..1b67d81 100644
--- a/bin/varnishd/cache/cache_rfc2616.c
+++ b/bin/varnishd/cache/cache_rfc2616.c
@@ -319,18 +319,18 @@ RFC2616_Do_Cond(const struct sess *sp)
 	   and If-Modified-Since if present*/
 
 	if (http_GetHdr(sp->req->http, H_If_Modified_Since, &p) ) {
-		if (!sp->wrk->obj->last_modified)
+		if (!sp->req->obj->last_modified)
 			return (0);
 		ims = VTIM_parse(p);
 		if (ims > sp->t_req)	/* [RFC2616 14.25] */
 			return (0);
-		if (sp->wrk->obj->last_modified > ims)
+		if (sp->req->obj->last_modified > ims)
 			return (0);
 		do_cond = 1;
 	}
 
 	if (http_GetHdr(sp->req->http, H_If_None_Match, &p) &&
-	    http_GetHdr(sp->wrk->obj->http, H_ETag, &e)) {
+	    http_GetHdr(sp->req->obj->http, H_ETag, &e)) {
 		if (strcmp(p,e) != 0)
 			return (0);
 		do_cond = 1;
diff --git a/bin/varnishd/cache/cache_vrt.c b/bin/varnishd/cache/cache_vrt.c
index 67875bd..2623bcc 100644
--- a/bin/varnishd/cache/cache_vrt.c
+++ b/bin/varnishd/cache/cache_vrt.c
@@ -110,8 +110,8 @@ vrt_selecthttp(const struct sess *sp, enum gethdr_e where)
 		hp = sp->req->resp;
 		break;
 	case HDR_OBJ:
-		CHECK_OBJ_NOTNULL(sp->wrk->obj, OBJECT_MAGIC);
-		hp = sp->wrk->obj->http;
+		CHECK_OBJ_NOTNULL(sp->req->obj, OBJECT_MAGIC);
+		hp = sp->req->obj->http;
 		break;
 	default:
 		INCOMPL();
@@ -401,8 +401,8 @@ VRT_synth_page(const struct sess *sp, unsigned flags, const char *str, ...)
 
 	(void)flags;
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
-	CHECK_OBJ_NOTNULL(sp->wrk->obj, OBJECT_MAGIC);
-	vsb = SMS_Makesynth(sp->wrk->obj);
+	CHECK_OBJ_NOTNULL(sp->req->obj, OBJECT_MAGIC);
+	vsb = SMS_Makesynth(sp->req->obj);
 	AN(vsb);
 
 	VSB_cat(vsb, str);
@@ -415,10 +415,10 @@ VRT_synth_page(const struct sess *sp, unsigned flags, const char *str, ...)
 		p = va_arg(ap, const char *);
 	}
 	va_end(ap);
-	SMS_Finish(sp->wrk->obj);
-	http_Unset(sp->wrk->obj->http, H_Content_Length);
-	http_PrintfHeader(sp->wrk, sp->vsl_id, sp->wrk->obj->http,
-	    "Content-Length: %zd", sp->wrk->obj->len);
+	SMS_Finish(sp->req->obj);
+	http_Unset(sp->req->obj->http, H_Content_Length);
+	http_PrintfHeader(sp->wrk, sp->vsl_id, sp->req->obj->http,
+	    "Content-Length: %zd", sp->req->obj->len);
 }
 
 /*--------------------------------------------------------------------*/
@@ -512,9 +512,9 @@ void
 VRT_purge(const struct sess *sp, double ttl, double grace)
 {
 	if (sp->req->cur_method == VCL_MET_HIT)
-		HSH_Purge(sp, sp->wrk->obj->objcore->objhead, ttl, grace);
+		HSH_Purge(sp, sp->req->obj->objcore->objhead, ttl, grace);
 	else if (sp->req->cur_method == VCL_MET_MISS)
-		HSH_Purge(sp, sp->wrk->objcore->objhead, ttl, grace);
+		HSH_Purge(sp, sp->req->objcore->objhead, ttl, grace);
 }
 
 /*--------------------------------------------------------------------
diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index 6e5c751..cb66ff7 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -88,8 +88,8 @@ VRT_DO_HDR(req,   proto,	sp->req->http,		HTTP_HDR_PROTO)
 VRT_DO_HDR(bereq, request,	sp->wrk->busyobj->bereq,	HTTP_HDR_REQ)
 VRT_DO_HDR(bereq, url,		sp->wrk->busyobj->bereq,	HTTP_HDR_URL)
 VRT_DO_HDR(bereq, proto,	sp->wrk->busyobj->bereq,	HTTP_HDR_PROTO)
-VRT_DO_HDR(obj,   proto,	sp->wrk->obj->http,	HTTP_HDR_PROTO)
-VRT_DO_HDR(obj,   response,	sp->wrk->obj->http,	HTTP_HDR_RESPONSE)
+VRT_DO_HDR(obj,   proto,	sp->req->obj->http,	HTTP_HDR_PROTO)
+VRT_DO_HDR(obj,   response,	sp->req->obj->http,	HTTP_HDR_RESPONSE)
 VRT_DO_HDR(resp,  proto,	sp->req->resp,		HTTP_HDR_PROTO)
 VRT_DO_HDR(resp,  response,	sp->req->resp,		HTTP_HDR_RESPONSE)
 VRT_DO_HDR(beresp,  proto,	sp->wrk->busyobj->beresp,	HTTP_HDR_PROTO)
@@ -114,7 +114,7 @@ VRT_r_##obj##_status(const struct sess *sp)			\
 	return(http->status);					\
 }
 
-VRT_DO_STATUS(obj, sp->wrk->obj->http)
+VRT_DO_STATUS(obj, sp->req->obj->http)
 VRT_DO_STATUS(beresp, sp->wrk->busyobj->beresp)
 VRT_DO_STATUS(resp, sp->req->resp)
 
@@ -145,9 +145,9 @@ VRT_l_beresp_saintmode(const struct sess *sp, double a)
 	if (!vbc->backend)
 		return;
 	CHECK_OBJ_NOTNULL(vbc->backend, BACKEND_MAGIC);
-	if (!sp->wrk->objcore)
+	if (!sp->req->objcore)
 		return;
-	CHECK_OBJ_NOTNULL(sp->wrk->objcore, OBJCORE_MAGIC);
+	CHECK_OBJ_NOTNULL(sp->req->objcore, OBJCORE_MAGIC);
 
 	/* Setting a negative holdoff period is a mistake. Detecting this
 	 * when compiling the VCL would be better.
@@ -156,7 +156,7 @@ VRT_l_beresp_saintmode(const struct sess *sp, double a)
 
 	ALLOC_OBJ(new, TROUBLE_MAGIC);
 	AN(new);
-	new->target = (uintptr_t)(sp->wrk->objcore->objhead);
+	new->target = (uintptr_t)(sp->req->objcore->objhead);
 	new->timeout = sp->t_req + a;
 
 	/* Insert the new item on the list before the first item with a
@@ -405,15 +405,15 @@ VRT_DO_EXP(req, sp->req->exp, ttl, 0, )
 VRT_DO_EXP(req, sp->req->exp, grace, 0, )
 VRT_DO_EXP(req, sp->req->exp, keep, 0, )
 
-VRT_DO_EXP(obj, sp->wrk->obj->exp, grace, 0,
-   EXP_Rearm(sp->wrk->obj);
-   vrt_wsp_exp(sp, sp->wrk->obj->xid, &sp->wrk->obj->exp);)
-VRT_DO_EXP(obj, sp->wrk->obj->exp, ttl, (sp->t_req - sp->wrk->obj->exp.entered),
-   EXP_Rearm(sp->wrk->obj);
-   vrt_wsp_exp(sp, sp->wrk->obj->xid, &sp->wrk->obj->exp);)
-VRT_DO_EXP(obj, sp->wrk->obj->exp, keep, 0,
-   EXP_Rearm(sp->wrk->obj);
-   vrt_wsp_exp(sp, sp->wrk->obj->xid, &sp->wrk->obj->exp);)
+VRT_DO_EXP(obj, sp->req->obj->exp, grace, 0,
+   EXP_Rearm(sp->req->obj);
+   vrt_wsp_exp(sp, sp->req->obj->xid, &sp->req->obj->exp);)
+VRT_DO_EXP(obj, sp->req->obj->exp, ttl, (sp->t_req - sp->req->obj->exp.entered),
+   EXP_Rearm(sp->req->obj);
+   vrt_wsp_exp(sp, sp->req->obj->xid, &sp->req->obj->exp);)
+VRT_DO_EXP(obj, sp->req->obj->exp, keep, 0,
+   EXP_Rearm(sp->req->obj);
+   vrt_wsp_exp(sp, sp->req->obj->xid, &sp->req->obj->exp);)
 
 VRT_DO_EXP(beresp, sp->wrk->busyobj->exp, grace, 0,
    vrt_wsp_exp(sp, sp->req->xid, &sp->wrk->busyobj->exp);)
@@ -531,8 +531,8 @@ VRT_r_obj_hits(const struct sess *sp)
 {
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
-	CHECK_OBJ_NOTNULL(sp->wrk->obj, OBJECT_MAGIC);	/* XXX */
-	return (sp->wrk->obj->hits);
+	CHECK_OBJ_NOTNULL(sp->req->obj, OBJECT_MAGIC);	/* XXX */
+	return (sp->req->obj->hits);
 }
 
 double
@@ -540,8 +540,8 @@ VRT_r_obj_lastuse(const struct sess *sp)
 {
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
-	CHECK_OBJ_NOTNULL(sp->wrk->obj, OBJECT_MAGIC);	/* XXX */
-	return (VTIM_real() - sp->wrk->obj->last_use);
+	CHECK_OBJ_NOTNULL(sp->req->obj, OBJECT_MAGIC);	/* XXX */
+	return (VTIM_real() - sp->req->obj->last_use);
 }
 
 unsigned
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index a6156d4..ccd45b1 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -256,11 +256,11 @@ STV_MkObject(struct worker *wrk, void *ptr, unsigned ltot,
 	VTAILQ_INIT(&o->store);
 	wrk->stats.n_object++;
 
-	if (wrk->objcore != NULL) {
-		CHECK_OBJ_NOTNULL(wrk->objcore, OBJCORE_MAGIC);
+	if (wrk->sp->req->objcore != NULL) {
+		CHECK_OBJ_NOTNULL(wrk->sp->req->objcore, OBJCORE_MAGIC);
 
-		o->objcore = wrk->objcore;
-		wrk->objcore = NULL;     /* refcnt follows pointer. */
+		o->objcore = wrk->sp->req->objcore;
+		wrk->sp->req->objcore = NULL;     /* refcnt follows pointer. */
 		BAN_NewObjCore(o->objcore);
 
 		o->objcore->methods = &default_oc_methods;
diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c
index 0791941..f90594e 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -474,10 +474,10 @@ smp_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot,
 	struct objcore *oc;
 	unsigned objidx;
 
-	if (wrk->objcore == NULL)
+	if (wrk->sp->req->objcore == NULL)
 		return (NULL);		/* from cnt_error */
 	CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC);
-	AN(wrk->objcore);
+	AN(wrk->sp->req->objcore);
 	AN(wrk->busyobj->exp.ttl > 0.);
 
 	ltot = IRNUP(sc, ltot);



More information about the varnish-commit mailing list