[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