[master] 95d70ea Improve the API for the obj-iter code a bit.

Poul-Henning Kamp phk at varnish-cache.org
Thu Oct 3 09:02:05 CEST 2013


commit 95d70ea6441c03c8e8fbb536b437e5e89344dd0a
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Oct 3 07:00:46 2013 +0000

    Improve the API for the obj-iter code a bit.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index a7ac6aa..36283bd 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -1063,8 +1063,14 @@ void *MPL_Get(struct mempool *mpl, unsigned *size);
 void MPL_Free(struct mempool *mpl, void *item);
 
 /* cache_obj.c */
+enum objiter_status {
+	OIS_DONE,
+	OIS_DATA,
+	OIS_STREAM,
+	OIS_ERROR,
+};
 struct objiter *ObjIterBegin(struct worker *, struct object *);
-int ObjIter(struct objiter *, void **, ssize_t *);
+enum objiter_status ObjIter(struct objiter *, void **, ssize_t *);
 void ObjIterEnd(struct objiter **);
 
 /* cache_panic.c */
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 24c6a6a..10f1626 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -471,6 +471,7 @@ vbf_stp_condfetch(struct worker *wrk, struct busyobj *bo)
 	void *sp;
 	ssize_t sl, al, tl, vl;
 	struct storage *st;
+	enum objiter_status ois;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
@@ -529,7 +530,8 @@ vbf_stp_condfetch(struct worker *wrk, struct busyobj *bo)
 	al = 0;
 
 	oi = ObjIterBegin(wrk, bo->ims_obj);
-	while (1 == ObjIter(oi, &sp, &sl)) {
+	do {
+		ois = ObjIter(oi, &sp, &sl);
 		while (sl > 0) {
 			if (st == NULL) {
 				st = VFP_GetStorage(bo, bo->ims_obj->len - al);
@@ -547,7 +549,7 @@ vbf_stp_condfetch(struct worker *wrk, struct busyobj *bo)
 			if (st->len == st->space)
 				st = NULL;
 		}
-	}
+	} while (ois == OIS_DATA || ois == OIS_STREAM);
 	ObjIterEnd(&oi);
 	assert(al == bo->ims_obj->len);
 	assert(obj->len == al);
diff --git a/bin/varnishd/cache/cache_http1_deliver.c b/bin/varnishd/cache/cache_http1_deliver.c
index 6ed3110..baf33d5 100644
--- a/bin/varnishd/cache/cache_http1_deliver.c
+++ b/bin/varnishd/cache/cache_http1_deliver.c
@@ -158,7 +158,7 @@ v1d_dorange(struct req *req, const char *r)
 static void
 v1d_WriteDirObj(struct req *req)
 {
-	int i;
+	enum objiter_status ois;
 	ssize_t len;
 	struct objiter *oi;
 	void *ptr;
@@ -168,12 +168,14 @@ v1d_WriteDirObj(struct req *req)
 	oi = ObjIterBegin(req->wrk, req->obj);
 	XXXAN(oi);
 
-	do {
-		i = ObjIter(oi, &ptr, &len);
-		if (i != 0)
-			if (VDP_bytes(req, i == 2 ? VDP_FLUSH : VDP_NULL,  ptr, len))
-				break;
-	} while (i);
+	while (1) {
+		ois = ObjIter(oi, &ptr, &len);
+		if (ois == OIS_DATA && !VDP_bytes(req, VDP_NULL,  ptr, len))
+			continue;
+		if (ois == OIS_STREAM && !VDP_bytes(req, VDP_FLUSH,  ptr, len))
+			continue;
+		break;
+	}
 	(void)VDP_bytes(req, VDP_FINISH,  NULL, 0);
 	ObjIterEnd(&oi);
 }
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index 2ca0a01..282b996 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -58,7 +58,7 @@ ObjIterBegin(struct worker *wrk, struct object *obj)
 	return (oi);
 }
 
-int
+enum objiter_status
 ObjIter(struct objiter *oi, void **p, ssize_t *l)
 {
 	ssize_t ol;
@@ -67,6 +67,8 @@ ObjIter(struct objiter *oi, void **p, ssize_t *l)
 	CHECK_OBJ_NOTNULL(oi, OBJITER_MAGIC);
 	AN(p);
 	AN(l);
+	*p = NULL;
+	*l = 0;
 
 	if (oi->bo == NULL) {
 		if (oi->st == NULL)
@@ -76,15 +78,21 @@ ObjIter(struct objiter *oi, void **p, ssize_t *l)
 		if (oi->st != NULL) {
 			*p = oi->st->ptr;
 			*l = oi->st->len;
-			return (1);
+			return (OIS_DATA);
 		}
-		return (0);
+		return (OIS_DONE);
 	} else {
 		ol = oi->len;
-		nl = VBO_waitlen(oi->bo, ol);
-		VSL(SLT_Debug, 0, "STREAM %zd -> %zd", ol, nl);
-		if (nl == ol)
-			return (0);
+		while (1) {
+			nl = VBO_waitlen(oi->bo, ol);
+			VSL(SLT_Debug, 0, "STREAM %zd -> %zd", ol, nl);
+			if (nl != ol)
+				break;
+			if (oi->bo->state == BOS_FINISHED)
+				return (OIS_DONE);
+			if (oi->bo->state == BOS_FAILED)
+				return (OIS_ERROR);
+		}
 		VTAILQ_FOREACH(oi->st, &oi->obj->store, list) {
 			if (oi->st->len <= ol) {
 				ol -= oi->st->len;
@@ -92,8 +100,8 @@ ObjIter(struct objiter *oi, void **p, ssize_t *l)
 			} else {
 				*p = oi->st->ptr + ol;
 				*l = (nl - ol);
-				oi->len += (nl - ol);
-				return (2);
+				oi->len += *l;
+				return (OIS_STREAM);
 			}
 		}
 		WRONG("ran off end");



More information about the varnish-commit mailing list