[master] 83ea35d Segregate the WRW related fields in their own structure for code clarity.

Poul-Henning Kamp phk at varnish-cache.org
Thu Mar 24 12:54:31 CET 2011


commit 83ea35df7297afd8ff8bdce494737164d8d3191b
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Mar 24 11:52:57 2011 +0000

    Segregate the WRW related fields in their own structure for code
    clarity.

diff --git a/bin/varnishd/cache.h b/bin/varnishd/cache.h
index 4c31a7e..840c774 100644
--- a/bin/varnishd/cache.h
+++ b/bin/varnishd/cache.h
@@ -248,6 +248,16 @@ struct exp {
 
 /*--------------------------------------------------------------------*/
 
+/* WRW related fields */
+struct wrw {
+	int			*wfd;
+	unsigned		werr;	/* valid after WRK_Flush() */
+	struct iovec		*iov;
+	unsigned		siov;
+	unsigned		niov;
+	ssize_t			liov;
+};
+
 struct worker {
 	unsigned		magic;
 #define WORKER_MAGIC		0x6391adcf
@@ -259,18 +269,13 @@ struct worker {
 
 	double			lastused;
 
+	struct wrw		wrw;
+
 	pthread_cond_t		cond;
 
 	VTAILQ_ENTRY(worker)	list;
 	struct workreq		*wrq;
 
-	int			*wfd;
-	unsigned		werr;	/* valid after WRK_Flush() */
-	struct iovec		*iov;
-	unsigned		siov;
-	unsigned		niov;
-	ssize_t			liov;
-
 	struct VCL_conf		*vcl;
 
 	uint32_t		*wlb, *wlp, *wle;
@@ -781,6 +786,7 @@ int WRK_Queue(struct workreq *wrq);
 int WRK_QueueSession(struct sess *sp);
 void WRK_SumStat(struct worker *w);
 
+#define WRW_IsReleased(w)	((w)->wrw.wfd == NULL)
 void WRW_Reserve(struct worker *w, int *fd);
 unsigned WRW_Flush(struct worker *w);
 unsigned WRW_FlushRelease(struct worker *w);
diff --git a/bin/varnishd/cache_center.c b/bin/varnishd/cache_center.c
index e3cc4e2..d3a9a43 100644
--- a/bin/varnishd/cache_center.c
+++ b/bin/varnishd/cache_center.c
@@ -240,7 +240,7 @@ cnt_deliver(struct sess *sp)
 
 	RES_WriteObj(sp);
 
-	AZ(sp->wrk->wfd);
+	assert(WRW_IsReleased(sp->wrk));
 	(void)HSH_Deref(sp->wrk, NULL, &sp->obj);
 	http_Setup(sp->wrk->resp, NULL);
 	sp->step = STP_DONE;
@@ -749,7 +749,7 @@ cnt_fetchbody(struct sess *sp)
 	http_Setup(sp->wrk->bereq, NULL);
 	http_Setup(sp->wrk->beresp, NULL);
 	sp->wrk->vfp = NULL;
-	AZ(sp->wrk->wfd);
+	assert(WRW_IsReleased(sp->wrk));
 	AZ(sp->vbc);
 	AN(sp->director);
 
@@ -1121,7 +1121,7 @@ cnt_pipe(struct sess *sp)
 	assert(sp->handling == VCL_RET_PIPE);
 
 	PipeSession(sp);
-	AZ(sp->wrk->wfd);
+	assert(WRW_IsReleased(sp->wrk));
 	http_Setup(sp->wrk->bereq, NULL);
 	sp->step = STP_DONE;
 	return (0);
@@ -1396,7 +1396,7 @@ CNT_Session(struct sess *sp)
 		CHECK_OBJ_ORNULL(w->nobjhead, OBJHEAD_MAGIC);
 	}
 	WSL_Flush(w, 0);
-	AZ(w->wfd);
+	assert(WRW_IsReleased(w));
 }
 
 /*
diff --git a/bin/varnishd/cache_http.c b/bin/varnishd/cache_http.c
index 4ebf878..b8cdb3a 100644
--- a/bin/varnishd/cache_http.c
+++ b/bin/varnishd/cache_http.c
@@ -1054,10 +1054,11 @@ unsigned
 http_Write(struct worker *w, const struct http *hp, int resp)
 {
 	unsigned u, l;
+	int fd = *(w->wrw.wfd);
 
 	if (resp) {
 		l = WRW_WriteH(w, &hp->hd[HTTP_HDR_PROTO], " ");
-		WSLH(w, *w->wfd, hp, HTTP_HDR_PROTO);
+		WSLH(w, fd, hp, HTTP_HDR_PROTO);
 
 		hp->hd[HTTP_HDR_STATUS].b = WS_Alloc(w->ws, 4);
 		AN(hp->hd[HTTP_HDR_STATUS].b);
@@ -1066,18 +1067,18 @@ http_Write(struct worker *w, const struct http *hp, int resp)
 		hp->hd[HTTP_HDR_STATUS].e = hp->hd[HTTP_HDR_STATUS].b + 3;
 
 		l += WRW_WriteH(w, &hp->hd[HTTP_HDR_STATUS], " ");
-		WSLH(w, *w->wfd, hp, HTTP_HDR_STATUS);
+		WSLH(w, fd, hp, HTTP_HDR_STATUS);
 
 		l += WRW_WriteH(w, &hp->hd[HTTP_HDR_RESPONSE], "\r\n");
-		WSLH(w, *w->wfd, hp, HTTP_HDR_RESPONSE);
+		WSLH(w, fd, hp, HTTP_HDR_RESPONSE);
 	} else {
 		AN(hp->hd[HTTP_HDR_URL].b);
 		l = WRW_WriteH(w, &hp->hd[HTTP_HDR_REQ], " ");
-		WSLH(w, *w->wfd, hp, HTTP_HDR_REQ);
+		WSLH(w, fd, hp, HTTP_HDR_REQ);
 		l += WRW_WriteH(w, &hp->hd[HTTP_HDR_URL], " ");
-		WSLH(w, *w->wfd, hp, HTTP_HDR_URL);
+		WSLH(w, fd, hp, HTTP_HDR_URL);
 		l += WRW_WriteH(w, &hp->hd[HTTP_HDR_PROTO], "\r\n");
-		WSLH(w, *w->wfd, hp, HTTP_HDR_PROTO);
+		WSLH(w, fd, hp, HTTP_HDR_PROTO);
 	}
 	for (u = HTTP_HDR_FIRST; u < hp->nhd; u++) {
 		if (hp->hd[u].b == NULL)
@@ -1085,7 +1086,7 @@ http_Write(struct worker *w, const struct http *hp, int resp)
 		AN(hp->hd[u].b);
 		AN(hp->hd[u].e);
 		l += WRW_WriteH(w, &hp->hd[u], "\r\n");
-		WSLH(w, *w->wfd, hp, u);
+		WSLH(w, fd, hp, u);
 	}
 	l += WRW_Write(w, "\r\n", -1);
 	return (l);
diff --git a/bin/varnishd/cache_pool.c b/bin/varnishd/cache_pool.c
index 0c80772..99ca6c3 100644
--- a/bin/varnishd/cache_pool.c
+++ b/bin/varnishd/cache_pool.c
@@ -143,8 +143,8 @@ wrk_thread_real(struct wq *qp, unsigned shm_workspace, unsigned sess_workspace,
 	w->bereq = HTTP_create(http0, nhttp);
 	w->beresp = HTTP_create(http1, nhttp);
 	w->resp = HTTP_create(http2, nhttp);
-	w->iov = iov;
-	w->siov = siov;
+	w->wrw.iov = iov;
+	w->wrw.siov = siov;
 	AZ(pthread_cond_init(&w->cond, NULL));
 
 	WS_Init(w->ws, "wrk", ws, sess_workspace);
@@ -189,7 +189,7 @@ wrk_thread_real(struct wq *qp, unsigned shm_workspace, unsigned sess_workspace,
 		AZ(w->bereq->ws);
 		AZ(w->beresp->ws);
 		AZ(w->resp->ws);
-		AZ(w->wfd);
+		AZ(w->wrw.wfd);
 		AZ(w->storage_hint);
 		assert(w->wlp == w->wlb);
 		w->wrq = NULL;
diff --git a/bin/varnishd/cache_wrw.c b/bin/varnishd/cache_wrw.c
index 37d09ae..f6ddec8 100644
--- a/bin/varnishd/cache_wrw.c
+++ b/bin/varnishd/cache_wrw.c
@@ -72,45 +72,51 @@ SVNID("$Id$")
 void
 WRW_Reserve(struct worker *w, int *fd)
 {
+	struct wrw *wrw;
 
 	CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
-	AZ(w->wfd);
-	w->werr = 0;
-	w->liov = 0;
-	w->niov = 0;
-	w->wfd = fd;
+	wrw = &w->wrw;
+	AZ(wrw->wfd);
+	wrw->werr = 0;
+	wrw->liov = 0;
+	wrw->niov = 0;
+	wrw->wfd = fd;
 }
 
 static void
 WRW_Release(struct worker *w)
 {
+	struct wrw *wrw;
 
 	CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
-	w->werr = 0;
-	w->liov = 0;
-	w->niov = 0;
-	w->wfd = NULL;
+	wrw = &w->wrw;
+	wrw->werr = 0;
+	wrw->liov = 0;
+	wrw->niov = 0;
+	wrw->wfd = NULL;
 }
 
 unsigned
 WRW_Flush(struct worker *w)
 {
 	ssize_t i;
+	struct wrw *wrw;
 
 	CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
-	AN(w->wfd);
-	if (*w->wfd >= 0 && w->niov > 0 && w->werr == 0) {
-		i = writev(*w->wfd, w->iov, w->niov);
-		if (i != w->liov) {
-			w->werr++;
-			WSL(w, SLT_Debug, *w->wfd,
+	wrw = &w->wrw;
+	AN(wrw->wfd);
+	if (*wrw->wfd >= 0 && wrw->niov > 0 && wrw->werr == 0) {
+		i = writev(*wrw->wfd, wrw->iov, wrw->niov);
+		if (i != wrw->liov) {
+			wrw->werr++;
+			WSL(w, SLT_Debug, *wrw->wfd,
 			    "Write error, retval = %d, len = %d, errno = %s",
-			    i, w->liov, strerror(errno));
+			    i, wrw->liov, strerror(errno));
 		}
 	}
-	w->liov = 0;
-	w->niov = 0;
-	return (w->werr);
+	wrw->liov = 0;
+	wrw->niov = 0;
+	return (wrw->werr);
 }
 
 unsigned
@@ -119,7 +125,7 @@ WRW_FlushRelease(struct worker *w)
 	unsigned u;
 
 	CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
-	AN(w->wfd);
+	AN(w->wrw.wfd);
 	u = WRW_Flush(w);
 	WRW_Release(w);
 	return (u);
@@ -131,7 +137,7 @@ WRW_WriteH(struct worker *w, const txt *hh, const char *suf)
 	unsigned u;
 
 	CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
-	AN(w->wfd);
+	AN(w->wrw.wfd);
 	AN(w);
 	AN(hh);
 	AN(hh->b);
@@ -145,19 +151,21 @@ WRW_WriteH(struct worker *w, const txt *hh, const char *suf)
 unsigned
 WRW_Write(struct worker *w, const void *ptr, int len)
 {
+	struct wrw *wrw;
 
 	CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
-	AN(w->wfd);
-	if (len == 0 || *w->wfd < 0)
+	wrw = &w->wrw;
+	AN(wrw->wfd);
+	if (len == 0 || *wrw->wfd < 0)
 		return (0);
 	if (len == -1)
 		len = strlen(ptr);
-	if (w->niov == w->siov)
+	if (wrw->niov == wrw->siov)
 		(void)WRW_Flush(w);
-	w->iov[w->niov].iov_base = TRUST_ME(ptr);
-	w->iov[w->niov].iov_len = len;
-	w->liov += len;
-	w->niov++;
+	wrw->iov[wrw->niov].iov_base = TRUST_ME(ptr);
+	wrw->iov[wrw->niov].iov_len = len;
+	wrw->liov += len;
+	wrw->niov++;
 	return (len);
 }
 
@@ -165,9 +173,11 @@ WRW_Write(struct worker *w, const void *ptr, int len)
 void
 WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len)
 {
+	struct wrw *wrw;
 
 	CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
-	AN(w->wfd);
+	wrw = &w->wrw;
+	AN(wrw->wfd);
 	assert(fd >= 0);
 	assert(len > 0);
 
@@ -175,31 +185,31 @@ WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len)
 	do {
 		struct sf_hdtr sfh;
 		memset(&sfh, 0, sizeof sfh);
-		if (w->niov > 0) {
-			sfh.headers = w->iov;
-			sfh.hdr_cnt = w->niov;
+		if (wrw->niov > 0) {
+			sfh.headers = wrw->iov;
+			sfh.hdr_cnt = wrw->niov;
 		}
-		if (sendfile(fd, *w->wfd, off, len, &sfh, NULL, 0) != 0)
-			w->werr++;
-		w->liov = 0;
-		w->niov = 0;
+		if (sendfile(fd, *wrw->wfd, off, len, &sfh, NULL, 0) != 0)
+			wrw->werr++;
+		wrw->liov = 0;
+		wrw->niov = 0;
 	} while (0);
 #elif defined(__linux__)
 	do {
 		if (WRK_Flush(w) == 0 &&
-		    sendfile(*w->wfd, fd, &off, len) != len)
-			w->werr++;
+		    sendfile(*wrw->wfd, fd, &off, len) != len)
+			wrw->werr++;
 	} while (0);
 #elif defined(__sun) && defined(HAVE_SENDFILEV)
 	do {
 		sendfilevec_t svvec[params->http_headers * 2 + 1];
 		size_t xferred = 0, expected = 0;
 		int i;
-		for (i = 0; i < w->niov; i++) {
+		for (i = 0; i < wrw->niov; i++) {
 			svvec[i].sfv_fd = SFV_FD_SELF;
 			svvec[i].sfv_flag = 0;
-			svvec[i].sfv_off = (off_t) w->iov[i].iov_base;
-			svvec[i].sfv_len = w->iov[i].iov_len;
+			svvec[i].sfv_off = (off_t) wrw->iov[i].iov_base;
+			svvec[i].sfv_len = wrw->iov[i].iov_len;
 			expected += svvec[i].sfv_len;
 		}
 		svvec[i].sfv_fd = fd;
@@ -207,17 +217,17 @@ WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len)
 		svvec[i].sfv_off = off;
 		svvec[i].sfv_len = len;
 		expected += svvec[i].sfv_len;
-		if (sendfilev(*w->wfd, svvec, i, &xferred) == -1 ||
+		if (sendfilev(*wrw->wfd, svvec, i, &xferred) == -1 ||
 		    xferred != expected)
-			w->werr++;
-		w->liov = 0;
-		w->niov = 0;
+			wrw->werr++;
+		wrw->liov = 0;
+		wrw->niov = 0;
 	} while (0);
 #elif defined(__sun) && defined(HAVE_SENDFILE)
 	do {
 		if (WRK_Flush(w) == 0 &&
-		    sendfile(*w->wfd, fd, &off, len) != len)
-			w->werr++;
+		    sendfile(*wrw->wfd, fd, &off, len) != len)
+			wrw->werr++;
 	} while (0);
 #else
 #error Unknown sendfile() implementation



More information about the varnish-commit mailing list