[master] 6ac5644 Code polishing
Poul-Henning Kamp
phk at varnish-cache.org
Tue Dec 6 09:09:59 CET 2011
commit 6ac5644bc8610840b59e52f183eed533c73f65d1
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Dec 6 08:09:50 2011 +0000
Code polishing
diff --git a/bin/varnishd/cache/cache_wrw.c b/bin/varnishd/cache/cache_wrw.c
index 2ffb45e..96fa3e5 100644
--- a/bin/varnishd/cache/cache_wrw.c
+++ b/bin/varnishd/cache/cache_wrw.c
@@ -57,19 +57,19 @@
*/
int
-WRW_Error(const struct worker *w)
+WRW_Error(const struct worker *wrk)
{
- return (w->wrw.werr);
+ return (wrk->wrw.werr);
}
void
-WRW_Reserve(struct worker *w, int *fd)
+WRW_Reserve(struct worker *wrk, int *fd)
{
struct wrw *wrw;
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- wrw = &w->wrw;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ wrw = &wrk->wrw;
AZ(wrw->wfd);
wrw->werr = 0;
wrw->liov = 0;
@@ -79,12 +79,12 @@ WRW_Reserve(struct worker *w, int *fd)
}
static void
-WRW_Release(struct worker *w)
+WRW_Release(struct worker *wrk)
{
struct wrw *wrw;
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- wrw = &w->wrw;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ wrw = &wrk->wrw;
AN(wrw->wfd);
wrw->werr = 0;
wrw->liov = 0;
@@ -93,15 +93,39 @@ WRW_Release(struct worker *w)
wrw->wfd = NULL;
}
+static void
+wrw_prune(struct wrw *wrw, ssize_t bytes)
+{
+ ssize_t used = 0;
+ ssize_t j, used_here;
+
+ for (j = 0; j < wrw->niov; j++) {
+ if (used + wrw->iov[j].iov_len > bytes) {
+ /* Cutoff is in this iov */
+ used_here = bytes - used;
+ wrw->iov[j].iov_len -= used_here;
+ wrw->iov[j].iov_base =
+ (char*)wrw->iov[j].iov_base + used_here;
+ memmove(wrw->iov, &wrw->iov[j],
+ (wrw->niov - j) * sizeof(struct iovec));
+ wrw->niov -= j;
+ wrw->liov -= bytes;
+ return;
+ }
+ used += wrw->iov[j].iov_len;
+ }
+ assert(wrw->liov == 0);
+}
+
unsigned
-WRW_Flush(struct worker *w)
+WRW_Flush(struct worker *wrk)
{
ssize_t i;
struct wrw *wrw;
char cbuf[32];
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- wrw = &w->wrw;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ wrw = &wrk->wrw;
AN(wrw->wfd);
/* For chunked, there must be one slot reserved for the chunked tail */
@@ -110,7 +134,8 @@ WRW_Flush(struct worker *w)
if (*wrw->wfd >= 0 && wrw->liov > 0 && wrw->werr == 0) {
if (wrw->ciov < wrw->siov && wrw->cliov > 0) {
- bprintf(cbuf, "00%jx\r\n", (intmax_t)wrw->cliov);
+ /* Add chunk head & tail */
+ bprintf(cbuf, "00%zx\r\n", wrw->cliov);
i = strlen(cbuf);
wrw->iov[wrw->ciov].iov_base = cbuf;
wrw->iov[wrw->ciov].iov_len = i;
@@ -123,48 +148,37 @@ WRW_Flush(struct worker *w)
wrw->iov[wrw->ciov].iov_base = cbuf;
wrw->iov[wrw->ciov].iov_len = 0;
}
+
i = writev(*wrw->wfd, wrw->iov, wrw->niov);
while (i != wrw->liov && i > 0) {
/* Remove sent data from start of I/O vector,
* then retry; we hit a timeout, but some data
* was sent.
-
- XXX: Add a "minimum sent data per timeout
- counter to prevent slowlaris attacks
+ *
+ * XXX: Add a "minimum sent data per timeout
+ * counter to prevent slowlaris attacks
*/
- size_t used = 0;
- if (VTIM_real() - w->sp->t_resp > cache_param->send_timeout) {
- WSL(w, SLT_Debug, *wrw->wfd,
- "Hit total send timeout, wrote = %ld/%ld; not retrying",
+ if (VTIM_real() - wrk->sp->t_resp >
+ cache_param->send_timeout) {
+ WSL(wrk, SLT_Debug, *wrw->wfd,
+ "Hit total send timeout, "
+ "wrote = %ld/%ld; not retrying",
i, wrw->liov);
i = -1;
break;
}
- WSL(w, SLT_Debug, *wrw->wfd,
+ WSL(wrk, SLT_Debug, *wrw->wfd,
"Hit send timeout, wrote = %ld/%ld; retrying",
i, wrw->liov);
- for (int j = 0; j < wrw->niov; j++) {
- if (used + wrw->iov[j].iov_len > i) {
- /* Cutoff is in this iov */
- int used_here = i - used;
- wrw->iov[j].iov_len -= used_here;
- wrw->iov[j].iov_base = (char*)wrw->iov[j].iov_base + used_here;
- memmove(wrw->iov, &wrw->iov[j],
- (wrw->niov - j) * sizeof(struct iovec));
- wrw->niov -= j;
- wrw->liov -= i;
- break;
- }
- used += wrw->iov[j].iov_len;
- }
+ wrw_prune(wrw, i);
i = writev(*wrw->wfd, wrw->iov, wrw->niov);
}
if (i <= 0) {
wrw->werr++;
- WSL(w, SLT_Debug, *wrw->wfd,
+ WSL(wrk, SLT_Debug, *wrw->wfd,
"Write error, retval = %zd, len = %zd, errno = %s",
i, wrw->liov, strerror(errno));
}
@@ -178,48 +192,48 @@ WRW_Flush(struct worker *w)
}
unsigned
-WRW_FlushRelease(struct worker *w)
+WRW_FlushRelease(struct worker *wrk)
{
unsigned u;
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- AN(w->wrw.wfd);
- u = WRW_Flush(w);
- WRW_Release(w);
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ AN(wrk->wrw.wfd);
+ u = WRW_Flush(wrk);
+ WRW_Release(wrk);
return (u);
}
unsigned
-WRW_WriteH(struct worker *w, const txt *hh, const char *suf)
+WRW_WriteH(struct worker *wrk, const txt *hh, const char *suf)
{
unsigned u;
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- AN(w->wrw.wfd);
- AN(w);
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ AN(wrk->wrw.wfd);
+ AN(wrk);
AN(hh);
AN(hh->b);
AN(hh->e);
- u = WRW_Write(w, hh->b, hh->e - hh->b);
+ u = WRW_Write(wrk, hh->b, hh->e - hh->b);
if (suf != NULL)
- u += WRW_Write(w, suf, -1);
+ u += WRW_Write(wrk, suf, -1);
return (u);
}
unsigned
-WRW_Write(struct worker *w, const void *ptr, int len)
+WRW_Write(struct worker *wrk, const void *ptr, int len)
{
struct wrw *wrw;
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- wrw = &w->wrw;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ wrw = &wrk->wrw;
AN(wrw->wfd);
if (len == 0 || *wrw->wfd < 0)
return (0);
if (len == -1)
len = strlen(ptr);
if (wrw->niov >= wrw->siov - (wrw->ciov < wrw->siov ? 1 : 0))
- (void)WRW_Flush(w);
+ (void)WRW_Flush(wrk);
wrw->iov[wrw->niov].iov_base = TRUST_ME(ptr);
wrw->iov[wrw->niov].iov_len = len;
wrw->liov += len;
@@ -232,12 +246,12 @@ WRW_Write(struct worker *w, const void *ptr, int len)
}
void
-WRW_Chunked(struct worker *w)
+WRW_Chunked(struct worker *wrk)
{
struct wrw *wrw;
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- wrw = &w->wrw;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ wrw = &wrk->wrw;
assert(wrw->ciov == wrw->siov);
/*
@@ -245,7 +259,7 @@ WRW_Chunked(struct worker *w)
* a chunk tail, we might as well flush right away.
*/
if (wrw->niov + 3 >= wrw->siov)
- (void)WRW_Flush(w);
+ (void)WRW_Flush(wrk);
wrw->ciov = wrw->niov++;
wrw->cliov = 0;
assert(wrw->ciov < wrw->siov);
@@ -260,30 +274,30 @@ WRW_Chunked(struct worker *w)
*/
void
-WRW_EndChunk(struct worker *w)
+WRW_EndChunk(struct worker *wrk)
{
struct wrw *wrw;
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- wrw = &w->wrw;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ wrw = &wrk->wrw;
assert(wrw->ciov < wrw->siov);
- (void)WRW_Flush(w);
+ (void)WRW_Flush(wrk);
wrw->ciov = wrw->siov;
wrw->niov = 0;
wrw->cliov = 0;
- (void)WRW_Write(w, "0\r\n\r\n", -1);
+ (void)WRW_Write(wrk, "0\r\n\r\n", -1);
}
#ifdef SENDFILE_WORKS
void
-WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len)
+WRW_Sendfile(struct worker *wrk, int fd, off_t off, unsigned len)
{
struct wrw *wrw;
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- wrw = &w->wrw;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ wrw = &wrk->wrw;
AN(wrw->wfd);
assert(fd >= 0);
assert(len > 0);
@@ -303,7 +317,7 @@ WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len)
} while (0);
#elif defined(__linux__)
do {
- if (WRW_Flush(w) == 0 &&
+ if (WRW_Flush(wrk) == 0 &&
sendfile(*wrw->wfd, fd, &off, len) != len)
wrw->werr++;
} while (0);
@@ -332,7 +346,7 @@ WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len)
} while (0);
#elif defined(__sun) && defined(HAVE_SENDFILE)
do {
- if (WRW_Flush(w) == 0 &&
+ if (WRW_Flush(wrk) == 0 &&
sendfile(*wrw->wfd, fd, &off, len) != len)
wrw->werr++;
} while (0);
More information about the varnish-commit
mailing list