r475 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Fri Jul 14 14:30:49 CEST 2006


Author: phk
Date: 2006-07-14 14:30:49 +0200 (Fri, 14 Jul 2006)
New Revision: 475

Modified:
   trunk/varnish-cache/bin/varnishd/cache_center.c
Log:
Have the states tell us if we are done yet with their return value,
so that we can implement disembarking the worker thread of the object
is busy.



Modified: trunk/varnish-cache/bin/varnishd/cache_center.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_center.c	2006-07-14 12:22:44 UTC (rev 474)
+++ trunk/varnish-cache/bin/varnishd/cache_center.c	2006-07-14 12:30:49 UTC (rev 475)
@@ -57,12 +57,13 @@
 DOT deliver2 -> DONE [style=bold]
  */
 
-static void
+static int
 cnt_deliver(struct worker *w, struct sess *sp)
 {
 
 	vca_write_obj(w, sp);
 	sp->step = STP_DONE;
+	return (0);
 }
 
 
@@ -76,7 +77,7 @@
 DOT	]
  */
 
-static void
+static int
 cnt_done(struct worker *w, struct sess *sp)
 {
 	char *b;
@@ -89,6 +90,7 @@
 	    strcmp(b, "HTTP/1.1")) {
 		vca_close_session(sp, "not HTTP/1.1");
 	}
+	return (1);
 }
 
 
@@ -105,7 +107,7 @@
 DOT error -> DONE
  */
 
-static void cnt_error(struct worker *w, struct sess *sp) { (void)w; (void)sp; INCOMPL(); }
+static int cnt_error(struct worker *w, struct sess *sp) { (void)w; (void)sp; INCOMPL(); }
 
 
 /*--------------------------------------------------------------------
@@ -156,7 +158,7 @@
 DOT fetch_error -> ERROR
  */
 
-static void
+static int
 cnt_fetch(struct worker *w, struct sess *sp)
 {
 
@@ -172,7 +174,7 @@
 		HSH_Deref(sp->obj);
 		sp->obj = NULL;
 		sp->step = STP_PASSBODY;
-		return;
+		return (0);
 	}
 	if (sp->handling == VCL_RET_INSERT_PASS) {
 		sp->obj->pass = 1;
@@ -180,13 +182,13 @@
 		HSH_Unbusy(sp->obj);
 		sp->obj = NULL;
 		sp->step = STP_PASSBODY;
-		return;
+		return (0);
 	}
 	if (sp->handling == VCL_RET_INSERT) {
 		sp->obj->cacheable = 1;
 		FetchBody(w, sp);
 		sp->step = STP_DELIVER;
-		return;
+		return (0);
 	}
 	if (sp->handling == VCL_RET_ERROR)
 		INCOMPL();
@@ -231,7 +233,7 @@
 DOT hit2 -> DELIVER [style=bold]
  */
 
-static void
+static int
 cnt_hit(struct worker *w, struct sess *sp)
 {
 
@@ -245,14 +247,14 @@
 		HSH_Deref(sp->obj);
 		sp->obj = NULL;
 		sp->step = STP_DONE;
-		return;
+		return (0);
 	}
 	if (sp->handling == VCL_RET_PASS) {
 		HSH_Deref(sp->obj);
 		sp->obj = NULL;
 		PassSession(w, sp);
 		sp->step = STP_PASSBODY;
-		return;
+		return (0);
 	}
 
 	if (sp->handling == VCL_RET_ERROR)
@@ -284,7 +286,7 @@
 DOT lookup2 -> MISS [label="miss", style=bold]
  */
 
-static void
+static int
 cnt_lookup(struct worker *w, struct sess *sp)
 {
 
@@ -292,17 +294,18 @@
 	if (sp->obj->busy) {
 		VSL_stats->cache_miss++;
 		sp->step = STP_MISS;
-		return;
+		return (0);
 	}
 	if (sp->obj->pass) {
 		VSL_stats->cache_hitpass++;
 		VSL(SLT_HitPass, sp->fd, "%u", sp->obj->xid);
 		sp->step = STP_HIT;
-		return;
+		return (0);
 	} 
 	VSL_stats->cache_hit++;
 	VSL(SLT_Hit, sp->fd, "%u", sp->obj->xid);
 	sp->step = STP_HIT;
+	return (0);
 }
 
 
@@ -343,7 +346,7 @@
 DOT
  */
 
-static void
+static int
 cnt_miss(struct worker *w, struct sess *sp)
 {
 
@@ -357,14 +360,14 @@
 		sp->obj = 0;
 		PassSession(w, sp);
 		sp->step = STP_PASSBODY;
-		return;
+		return (0);
 	}
 	if (sp->handling == VCL_RET_LOOKUP)
 		INCOMPL();
 	if (sp->handling == VCL_RET_FETCH) {
 		FetchHeaders(w, sp);
 		sp->step = STP_FETCH;
-		return;
+		return (0);
 	}
 	INCOMPL();
 }
@@ -384,12 +387,13 @@
 DOT pass -> PASSBODY
  */
 
-static void
+static int
 cnt_pass(struct worker *w, struct sess *sp)
 {
 
 	PassSession(w, sp);
 	sp->step = STP_PASSBODY;
+	return (0);
 }
 
 
@@ -407,12 +411,12 @@
 DOT passbody -> DONE
  */
 
-static void
+static int
 cnt_passbody(struct worker *w, struct sess *sp)
 {
 	PassBody(w, sp);
 	sp->step = STP_DONE;
-	return;
+	return (0);
 }
 
 
@@ -430,12 +434,13 @@
 DOT pipe -> DONE
  */
 
-static void
+static int
 cnt_pipe(struct worker *w, struct sess *sp)
 {
 
 	PipeSession(w, sp);
 	sp->step = STP_DONE;
+	return (0);
 }
 
 
@@ -465,7 +470,7 @@
 DOT recv_error -> ERROR
  */
 
-static void
+static int
 cnt_recv(struct worker *w, struct sess *sp)
 {
 	int done;
@@ -474,7 +479,7 @@
 	if (done != 0) {
 		RES_Error(w, sp, done, NULL);
 		sp->step = STP_DONE;
-		return;
+		return (0);
 	}
 
 	sp->backend = sp->vcl->backend[0];
@@ -489,17 +494,17 @@
 	case VCL_RET_LOOKUP:
 		/* XXX: discard req body, if any */
 		sp->step = STP_LOOKUP;
-		return;
+		return (0);
 	case VCL_RET_PIPE:
 		sp->step = STP_PIPE;
-		return;
+		return (0);
 	case VCL_RET_PASS:
 		sp->step = STP_PASS;
-		return;
+		return (0);
 	case VCL_RET_ERROR:
 		/* XXX: discard req body, if any */
 		sp->step = STP_ERROR;
-		return;
+		return (0);
 	default:
 		INCOMPL();
 	}
@@ -517,6 +522,7 @@
 void
 CNT_Session(struct worker *w, struct sess *sp)
 {
+	int done;
 
 	sp->t0 = time(NULL);
 	sp->vcl = VCL_Get();
@@ -525,12 +531,13 @@
 
 	SES_RefSrcAddr(sp);
 
-	for (sp->step = STP_RECV; sp->step != STP_DONE; ) {
+	sp->step = STP_RECV;
+	for (done = 0; !done; ) {
 		switch (sp->step) {
 #define STEP(l,u) \
 		case STP_##u: \
 			VSL(SLT_Debug, sp->fd, "State " #u); \
-			cnt_##l(w, sp); \
+			done = cnt_##l(w, sp); \
 			break;
 #include "steps.h"
 #undef STEP
@@ -538,8 +545,6 @@
 		}
 	}
 
-	cnt_done(w, sp);	/* The loop doesn't do this */
-
 	VCL_Rel(sp->vcl);
 	sp->vcl = NULL;
 




More information about the varnish-commit mailing list