[master] d9037dd Move some of the magic bits related to gzip-editing onto the worker thread workspace, to make sure they are not overwritten before they make it out the wire.

Poul-Henning Kamp phk at varnish-cache.org
Thu Mar 24 10:45:01 CET 2011


commit d9037ddff65bed9cafb0de2b8bb944fda0596b60
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Mar 24 09:44:31 2011 +0000

    Move some of the magic bits related to gzip-editing onto the worker
    thread workspace, to make sure they are not overwritten before they
    make it out the wire.

diff --git a/bin/varnishd/cache_esi_deliver.c b/bin/varnishd/cache_esi_deliver.c
index 48a9948..179c31f 100644
--- a/bin/varnishd/cache_esi_deliver.c
+++ b/bin/varnishd/cache_esi_deliver.c
@@ -467,7 +467,7 @@ ESI_DeliverChild(const struct sess *sp)
 	u_char *p, cc;
 	uint32_t icrc;
 	uint32_t ilen;
-	uint8_t pad[6] = { 0 };
+	uint8_t *dbits;
 
 	if (!sp->obj->gziped) {
 		VTAILQ_FOREACH(st, &sp->obj->store, list)
@@ -479,6 +479,9 @@ ESI_DeliverChild(const struct sess *sp)
 	 * blocks, stripping the "LAST" bit of the last one and
 	 * padding it, as necessary, to a byte boundary.
 	 */
+
+	dbits = (void*)WS_Alloc(sp->wrk->ws, 8);
+	AN(dbits);
 	obj = sp->obj;
 	CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
 	start = obj->gzip_start;
@@ -489,7 +492,6 @@ ESI_DeliverChild(const struct sess *sp)
 	assert(stop > 0 && stop < obj->len * 8);
 	assert(last >= start);
 	assert(last < stop);
-//printf("BITS %jd %jd %jd\n", start, last, stop);
 
 	/* The start bit must be byte aligned. */
 	AZ(start & 7);
@@ -498,12 +500,10 @@ ESI_DeliverChild(const struct sess *sp)
 	 * XXX: optimize for the case where the 'last'
 	 * XXX: bit is in a empty copy block
 	 */
-	cc = ved_deliver_byterange(sp, start/8, last/8);
-//printf("CC_LAST %x\n", cc);
-	cc &= ~(1U << (last & 7));
-	ved_sendchunk(sp, NULL, 0, &cc, 1);
+	*dbits = ved_deliver_byterange(sp, start/8, last/8);
+	*dbits &= ~(1U << (last & 7));
+	ved_sendchunk(sp, NULL, 0, dbits, 1);
 	cc = ved_deliver_byterange(sp, 1 + last/8, stop/8);
-//printf("CC_STOP %x (%d)\n", cc, (int)(stop & 7));
 	switch((int)(stop & 7)) {
 	case 0: /* xxxxxxxx */
 		/* I think we have an off by one here, but that's OK */
@@ -512,46 +512,47 @@ ESI_DeliverChild(const struct sess *sp)
 	case 1: /* x000.... 00000000 00000000 11111111 11111111 */
 	case 3: /* xxx000.. 00000000 00000000 11111111 11111111 */
 	case 5: /* xxxxx000 00000000 00000000 11111111 11111111 */
-		pad[0] = cc | 0x00;
-		pad[1] = 0x00; pad[2] = 0x00; pad[3] = 0xff; pad[4] = 0xff;
+		dbits[1] = cc | 0x00;
+		dbits[2] = 0x00; dbits[3] = 0x00;
+	        dbits[4] = 0xff; dbits[5] = 0xff;
 		lpad = 5;
 		break;
 	case 2: /* xx010000 00000100 00000001 00000000 */
-		pad[0] = cc | 0x08;
-		pad[1] = 0x20;
-		pad[2] = 0x80;
-		pad[3] = 0x00;
+		dbits[1] = cc | 0x08;
+		dbits[2] = 0x20;
+		dbits[3] = 0x80;
+		dbits[4] = 0x00;
 		lpad = 4;
 		break;
 	case 4: /* xxxx0100 00000001 00000000 */
-		pad[0] = cc | 0x20;
-		pad[1] = 0x80;
-		pad[2] = 0x00;
+		dbits[1] = cc | 0x20;
+		dbits[2] = 0x80;
+		dbits[3] = 0x00;
 		lpad = 3;
 		break;
 	case 6: /* xxxxxx01 00000000 */
-		pad[0] = cc | 0x80;
-		pad[1] = 0x00;
+		dbits[1] = cc | 0x80;
+		dbits[2] = 0x00;
 		lpad = 2;
 		break;
 	case 7:	/* xxxxxxx0 00...... 00000000 00000000 11111111 11111111 */
-		pad[0] = cc | 0x00;
-		pad[1] = 0x00;
-		pad[2] = 0x00; pad[3] = 0x00; pad[4] = 0xff; pad[5] = 0xff;
+		dbits[1] = cc | 0x00;
+		dbits[2] = 0x00;
+		dbits[3] = 0x00; dbits[4] = 0x00;
+	        dbits[5] = 0xff; dbits[6] = 0xff;
 		lpad = 6;
 		break;
 	default:
 		INCOMPL();
 	}
 	if (lpad > 0)
-		ved_sendchunk(sp, NULL, 0, pad, lpad);
+		ved_sendchunk(sp, NULL, 0, dbits + 1, lpad);
 	st = VTAILQ_LAST(&sp->obj->store, storagehead);
 	assert(st->len > 8);
 
 	p = st->ptr + st->len - 8;
 	icrc = vle32dec(p);
 	ilen = vle32dec(p + 4);
-//printf("CRC %08x LEN %d\n", icrc, ilen);
 	sp->wrk->crc = crc32_combine(sp->wrk->crc, icrc, ilen);
 	sp->wrk->l_crc += ilen;
 }



More information about the varnish-commit mailing list