[master] 3dc7521 Convert to use ObjIterate()
Poul-Henning Kamp
phk at FreeBSD.org
Thu Dec 10 01:23:28 CET 2015
commit 3dc7521c6db46919630c735664a7e147e14a0a87
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Dec 9 22:49:10 2015 +0000
Convert to use ObjIterate()
diff --git a/bin/varnishd/cache/cache_esi_deliver.c b/bin/varnishd/cache/cache_esi_deliver.c
index abc705b..a4f8d72 100644
--- a/bin/varnishd/cache/cache_esi_deliver.c
+++ b/bin/varnishd/cache/cache_esi_deliver.c
@@ -516,30 +516,178 @@ ved_pretend_gzip(struct req *req, enum vdp_action act, void **priv,
* much cheaper than running a gunzip instance.
*/
+struct ved_foo {
+ unsigned magic;
+#define VED_FOO_MAGIC 0x6a5a262d
+ struct req *req;
+ struct req *preq;
+ ssize_t start, last, stop, lpad;
+ ssize_t ll;
+ uint64_t olen;
+ uint8_t *dbits;
+ uint8_t tailbuf[8];
+};
+
+static int
+ved_objiterate(void *priv, int flush, const void *ptr, ssize_t len)
+{
+ struct ved_foo *foo;
+ const uint8_t *pp;
+ ssize_t dl;
+ ssize_t l;
+
+ CAST_OBJ_NOTNULL(foo, priv, VED_FOO_MAGIC);
+ (void)flush;
+ pp = ptr;
+ if (len > 0) {
+ /* Skip over the GZIP header */
+ dl = foo->start / 8 - foo->ll;
+ if (dl > 0) {
+ /* Before foo.start, skip */
+ if (dl > len)
+ dl = len;
+ foo->ll += dl;
+ len -= dl;
+ pp += dl;
+ }
+ }
+ if (len > 0) {
+ /* The main body of the object */
+ dl = foo->last / 8 - foo->ll;
+ if (dl > 0) {
+ if (dl > len)
+ dl = len;
+ if (ved_bytes(foo->req, foo->preq, VDP_NULL, pp, dl))
+ return(-1);
+ foo->ll += dl;
+ len -= dl;
+ pp += dl;
+ }
+ }
+ if (len > 0 && foo->ll == foo->last / 8) {
+ /* Remove the "LAST" bit */
+ foo->dbits[0] = *pp;
+ foo->dbits[0] &= ~(1U << (foo->last & 7));
+ if (ved_bytes(foo->req, foo->preq, VDP_NULL, foo->dbits, 1))
+ return (-1);
+ foo->ll++;
+ len--;
+ pp++;
+ }
+ if (len > 0) {
+ /* Last block */
+ dl = foo->stop / 8 - foo->ll;
+ if (dl > 0) {
+ if (dl > len)
+ dl = len;
+ if (ved_bytes(foo->req, foo->preq, VDP_NULL, pp, dl))
+ return (-1);
+ foo->ll += dl;
+ len -= dl;
+ pp += dl;
+ }
+ }
+ if (len > 0 && (foo->stop & 7) && foo->ll == foo->stop / 8) {
+ /* Add alignment to byte boundary */
+ foo->dbits[1] = *pp;
+ foo->ll++;
+ len--;
+ pp++;
+ switch((int)(foo->stop & 7)) {
+ case 1: /*
+ * x000....
+ * 00000000 00000000 11111111 11111111
+ */
+ case 3: /*
+ * xxx000..
+ * 00000000 00000000 11111111 11111111
+ */
+ case 5: /*
+ * xxxxx000
+ * 00000000 00000000 11111111 11111111
+ */
+ foo->dbits[2] = 0x00; foo->dbits[3] = 0x00;
+ foo->dbits[4] = 0xff; foo->dbits[5] = 0xff;
+ foo->lpad = 5;
+ break;
+ case 2: /* xx010000 00000100 00000001 00000000 */
+ foo->dbits[1] |= 0x08;
+ foo->dbits[2] = 0x20;
+ foo->dbits[3] = 0x80;
+ foo->dbits[4] = 0x00;
+ foo->lpad = 4;
+ break;
+ case 4: /* xxxx0100 00000001 00000000 */
+ foo->dbits[1] |= 0x20;
+ foo->dbits[2] = 0x80;
+ foo->dbits[3] = 0x00;
+ foo->lpad = 3;
+ break;
+ case 6: /* xxxxxx01 00000000 */
+ foo->dbits[1] |= 0x80;
+ foo->dbits[2] = 0x00;
+ foo->lpad = 2;
+ break;
+ case 7: /*
+ * xxxxxxx0
+ * 00......
+ * 00000000 00000000 11111111 11111111
+ */
+ foo->dbits[2] = 0x00;
+ foo->dbits[3] = 0x00; foo->dbits[4] = 0x00;
+ foo->dbits[5] = 0xff; foo->dbits[6] = 0xff;
+ foo->lpad = 6;
+ break;
+ case 0: /* xxxxxxxx */
+ default:
+ WRONG("compiler must be broken");
+ }
+ if (ved_bytes(foo->req, foo->preq,
+ VDP_NULL, foo->dbits + 1, foo->lpad))
+ return (-1);
+ }
+ if (len > 0) {
+ /* Recover GZIP tail */
+ dl = foo->olen - foo->ll;
+ assert(dl >= 0);
+ if (dl > len)
+ dl = len;
+ if (dl > 0) {
+ assert(dl <= 8);
+ l = foo->ll - (foo->olen - 8);
+ assert(l >= 0);
+ assert(l <= 8);
+ assert(l + dl <= 8);
+ memcpy(foo->tailbuf + l, pp, dl);
+ foo->ll += dl;
+ len -= dl;
+ }
+ }
+ assert(len == 0);
+ return (0);
+}
+
static void
ved_stripgzip(struct req *req, struct busyobj *bo)
{
- ssize_t start, last, stop, lpad;
ssize_t l;
char *p;
uint32_t icrc;
uint32_t ilen;
- uint64_t olen;
uint8_t *dbits;
- uint8_t *pp;
- uint8_t tailbuf[8];
- enum objiter_status ois;
- void *oi;
- void *sp;
- ssize_t sl, ll, dl;
struct ecx *ecx;
- struct req *preq;
+ struct ved_foo foo;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
CAST_OBJ_NOTNULL(ecx, req->transport_priv, ECX_MAGIC);
- preq = ecx->preq;
+ INIT_OBJ(&foo, VED_FOO_MAGIC);
+ foo.req = req;
+ foo.preq = ecx->preq;
+ memset(foo.tailbuf, 0xdd, sizeof foo.tailbuf);
+
+ /* XXX: Is this really required ? */
if (bo != NULL)
VBO_waitstate(bo, BOS_FINISHED);
@@ -554,162 +702,28 @@ ved_stripgzip(struct req *req, struct busyobj *bo)
p = ObjGetattr(req->wrk, req->objcore, OA_GZIPBITS, &l);
AN(p);
assert(l == 32);
- start = vbe64dec(p);
- last = vbe64dec(p + 8);
- stop = vbe64dec(p + 16);
- olen = ObjGetLen(req->wrk, req->objcore);
- assert(start > 0 && start < olen * 8);
- assert(last > 0 && last < olen * 8);
- assert(stop > 0 && stop < olen * 8);
- assert(last >= start);
- assert(last < stop);
+ foo.start = vbe64dec(p);
+ foo.last = vbe64dec(p + 8);
+ foo.stop = vbe64dec(p + 16);
+ foo.olen = ObjGetLen(req->wrk, req->objcore);
+ assert(foo.start > 0 && foo.start < foo.olen * 8);
+ assert(foo.last > 0 && foo.last < foo.olen * 8);
+ assert(foo.stop > 0 && foo.stop < foo.olen * 8);
+ assert(foo.last >= foo.start);
+ assert(foo.last < foo.stop);
/* The start bit must be byte aligned. */
- AZ(start & 7);
-
- /*
- * XXX: optimize for the case where the 'last'
- * XXX: bit is in a empty copy block
- */
+ AZ(foo.start & 7);
- memset(tailbuf, 0xdd, sizeof tailbuf);
dbits = WS_Alloc(req->ws, 8);
AN(dbits);
- ll = 0;
- oi = ObjIterBegin(req->wrk, req->objcore);
- do {
- ois = ObjIter(req->objcore, oi, &sp, &sl);
- pp = sp;
- if (sl > 0) {
- /* Skip over the GZIP header */
- dl = start / 8 - ll;
- if (dl > 0) {
- /* Before start, skip */
- if (dl > sl)
- dl = sl;
- ll += dl;
- sl -= dl;
- pp += dl;
- }
- }
- if (sl > 0) {
- /* The main body of the object */
- dl = last / 8 - ll;
- if (dl > 0) {
- if (dl > sl)
- dl = sl;
- if (ved_bytes(req, preq, VDP_NULL, pp, dl))
- break;
- ll += dl;
- sl -= dl;
- pp += dl;
- }
- }
- if (sl > 0 && ll == last / 8) {
- /* Remove the "LAST" bit */
- dbits[0] = *pp;
- dbits[0] &= ~(1U << (last & 7));
- if (ved_bytes(req, preq, VDP_NULL, dbits, 1))
- break;
- ll++;
- sl--;
- pp++;
- }
- if (sl > 0) {
- /* Last block */
- dl = stop / 8 - ll;
- if (dl > 0) {
- if (dl > sl)
- dl = sl;
- if (ved_bytes(req, preq, VDP_NULL, pp, dl))
- break;
- ll += dl;
- sl -= dl;
- pp += dl;
- }
- }
- if (sl > 0 && (stop & 7) && ll == stop / 8) {
- /* Add alignment to byte boundary */
- dbits[1] = *pp;
- ll++;
- sl--;
- pp++;
- switch((int)(stop & 7)) {
- case 1: /*
- * x000....
- * 00000000 00000000 11111111 11111111
- */
- case 3: /*
- * xxx000..
- * 00000000 00000000 11111111 11111111
- */
- case 5: /*
- * xxxxx000
- * 00000000 00000000 11111111 11111111
- */
- dbits[2] = 0x00; dbits[3] = 0x00;
- dbits[4] = 0xff; dbits[5] = 0xff;
- lpad = 5;
- break;
- case 2: /* xx010000 00000100 00000001 00000000 */
- dbits[1] |= 0x08;
- dbits[2] = 0x20;
- dbits[3] = 0x80;
- dbits[4] = 0x00;
- lpad = 4;
- break;
- case 4: /* xxxx0100 00000001 00000000 */
- dbits[1] |= 0x20;
- dbits[2] = 0x80;
- dbits[3] = 0x00;
- lpad = 3;
- break;
- case 6: /* xxxxxx01 00000000 */
- dbits[1] |= 0x80;
- dbits[2] = 0x00;
- lpad = 2;
- break;
- case 7: /*
- * xxxxxxx0
- * 00......
- * 00000000 00000000 11111111 11111111
- */
- dbits[2] = 0x00;
- dbits[3] = 0x00; dbits[4] = 0x00;
- dbits[5] = 0xff; dbits[6] = 0xff;
- lpad = 6;
- break;
- case 0: /* xxxxxxxx */
- default:
- WRONG("compiler must be broken");
- }
- if (ved_bytes(req, preq, VDP_NULL, dbits + 1, lpad))
- break;
- }
- if (sl > 0) {
- /* Recover GZIP tail */
- dl = olen - ll;
- assert(dl >= 0);
- if (dl > sl)
- dl = sl;
- if (dl > 0) {
- assert(dl <= 8);
- l = ll - (olen - 8);
- assert(l >= 0);
- assert(l <= 8);
- assert(l + dl <= 8);
- memcpy(tailbuf + l, pp, dl);
- ll += dl;
- sl -= dl;
- pp += dl;
- }
- }
- } while (ois == OIS_DATA || ois == OIS_STREAM);
- ObjIterEnd(req->objcore, &oi);
- (void)ved_bytes(req, preq, VDP_FLUSH, NULL, 0);
+ foo.dbits = dbits;
+ (void)ObjIterate(req->wrk, req->objcore, &foo, ved_objiterate);
+ /* XXX: error check ?? */
+ (void)ved_bytes(req, foo.preq, VDP_FLUSH, NULL, 0);
- icrc = vle32dec(tailbuf);
- ilen = vle32dec(tailbuf + 4);
+ icrc = vle32dec(foo.tailbuf);
+ ilen = vle32dec(foo.tailbuf + 4);
ecx->crc = crc32_combine(ecx->crc, icrc, ilen);
ecx->l_crc += ilen;
More information about the varnish-commit
mailing list