[master] b2930e5 Give the state engine a explanatory enum, rather than magic values of 0, 1 and 2.

Poul-Henning Kamp phk at varnish-cache.org
Wed Jan 23 12:03:10 CET 2013


commit b2930e5d73da0d722447210ef24134b7f6969f33
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Jan 23 11:02:45 2013 +0000

    Give the state engine a explanatory enum, rather than magic values
    of 0, 1 and 2.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index f13218e..27f2a12 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -57,6 +57,16 @@
 
 #include "common/params.h"
 
+/*--------------------------------------------------------------------*/
+
+enum req_fsm_nxt {
+	REQ_FSM_MORE,
+	REQ_FSM_DONE,
+	REQ_FSM_DISEMBARK,
+};
+
+/*--------------------------------------------------------------------*/
+
 enum body_status {
 #define BODYSTATUS(U,l)	BS_##U,
 #include "tbl/body_status.h"
@@ -786,7 +796,7 @@ int HTTP1_CacheReqBody(struct req *req, ssize_t maxsize);
 int HTTP1_IterateReqBody(struct req *req, req_body_iter_f *func, void *priv);
 
 /* cache_req_fsm.c [CNT] */
-int CNT_Request(struct worker *, struct req *);
+enum req_fsm_nxt CNT_Request(struct worker *, struct req *);
 
 /* cache_cli.c [CLI] */
 void CLI_Init(void);
diff --git a/bin/varnishd/cache/cache_http1_fsm.c b/bin/varnishd/cache/cache_http1_fsm.c
index 18eb64b..83b0914 100644
--- a/bin/varnishd/cache/cache_http1_fsm.c
+++ b/bin/varnishd/cache/cache_http1_fsm.c
@@ -84,7 +84,7 @@
  * Collect a request from the client.
  */
 
-static int
+static enum req_fsm_nxt
 http1_wait(struct sess *sp, struct worker *wrk, struct req *req)
 {
 	int j, tmo;
@@ -120,7 +120,7 @@ http1_wait(struct sess *sp, struct worker *wrk, struct req *req)
 		if (hs == HTC_COMPLETE) {
 			/* Got it, run with it */
 			req->t_req = now;
-			return (0);
+			return (REQ_FSM_MORE);
 		} else if (hs == HTC_ERROR_EOF) {
 			why = SC_REM_CLOSE;
 			break;
@@ -141,7 +141,7 @@ http1_wait(struct sess *sp, struct worker *wrk, struct req *req)
 				wrk->stats.sess_herd++;
 				SES_ReleaseReq(req);
 				WAIT_Enter(sp);
-				return (1);
+				return (REQ_FSM_DONE);
 			}
 		} else {
 			/* Working on it */
@@ -158,7 +158,7 @@ http1_wait(struct sess *sp, struct worker *wrk, struct req *req)
 	SES_ReleaseReq(req);
 	assert(why != SC_NULL);
 	SES_Delete(sp, why, now);
-	return (1);
+	return (REQ_FSM_DONE);
 }
 
 /*----------------------------------------------------------------------
@@ -238,7 +238,7 @@ http1_cleanup(struct sess *sp, struct worker *wrk, struct req *req)
 /*----------------------------------------------------------------------
  */
 
-static int
+static enum req_fsm_nxt
 http1_dissect(struct worker *wrk, struct req *req)
 {
 	const char *r = "HTTP/1.1 100 Continue\r\n\r\n";
@@ -266,7 +266,7 @@ http1_dissect(struct worker *wrk, struct req *req)
 	if (req->err_code == 400) {
 		wrk->stats.client_req_400++;
 		SES_Close(req->sp, SC_RX_JUNK);
-		return (1);
+		return (REQ_FSM_DONE);
 	}
 	req->acct_req.req++;
 
@@ -280,7 +280,7 @@ http1_dissect(struct worker *wrk, struct req *req)
 			req->err_code = 417;
 		} else if (strlen(r) != write(req->sp->fd, r, strlen(r))) {
 			SES_Close(req->sp, SC_REM_CLOSE);
-			return (1);
+			return (REQ_FSM_DONE);
 		}
 	} else if (req->err_code == 413)
 		wrk->stats.client_req_413++;
@@ -293,7 +293,7 @@ http1_dissect(struct worker *wrk, struct req *req)
 
 	HTTP_Copy(req->http0, req->http);	// For ESI & restart
 
-	return (0);
+	return (REQ_FSM_MORE);
 }
 
 /*----------------------------------------------------------------------
@@ -302,7 +302,7 @@ http1_dissect(struct worker *wrk, struct req *req)
 void
 HTTP1_Session(struct worker *wrk, struct req *req)
 {
-	int done = 0;
+	enum req_fsm_nxt nxt = REQ_FSM_MORE;
 	struct sess *sp;
 	enum http1_cleanup_ret sdr;
 
@@ -343,12 +343,12 @@ HTTP1_Session(struct worker *wrk, struct req *req)
 
 		if (sp->sess_step == S_STP_WORKING) {
 			if (req->req_step == R_STP_RECV)
-				done = http1_dissect(wrk, req);
-			if (done == 0)
-				done = CNT_Request(wrk, req);
-			if (done == 2)
+				nxt = http1_dissect(wrk, req);
+			if (nxt == REQ_FSM_MORE)
+				nxt = CNT_Request(wrk, req);
+			if (nxt == REQ_FSM_DISEMBARK)
 				return;
-			assert(done == 1);
+			assert(nxt == REQ_FSM_DONE);
 			sdr = http1_cleanup(sp, wrk, req);
 			switch (sdr) {
 			case SESS_DONE_RET_GONE:
@@ -366,8 +366,8 @@ HTTP1_Session(struct worker *wrk, struct req *req)
 		}
 
 		if (sp->sess_step == S_STP_NEWREQ) {
-			done = http1_wait(sp, wrk, req);
-			if (done)
+			nxt = http1_wait(sp, wrk, req);
+			if (nxt != REQ_FSM_MORE)
 				return;
 			sp->sess_step = S_STP_WORKING;
 			req->req_step = R_STP_RECV;
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 7ff0d41..982e9de 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -91,7 +91,7 @@ DOT }
  *
  */
 
-static int
+static enum req_fsm_nxt
 cnt_prepresp(struct worker *wrk, struct req *req)
 {
 	struct busyobj *bo;
@@ -175,12 +175,12 @@ cnt_prepresp(struct worker *wrk, struct req *req)
 		AZ(req->obj);
 		http_Teardown(req->resp);
 		req->req_step = R_STP_RESTART;
-		return (0);
+		return (REQ_FSM_MORE);
 	default:
 		WRONG("Illegal action in vcl_deliver{}");
 	}
 	req->req_step = R_STP_DELIVER;
-	return (0);
+	return (REQ_FSM_MORE);
 }
 
 /*--------------------------------------------------------------------
@@ -198,7 +198,7 @@ DOT deliver -> DONE [style=bold,color=blue]
  *
  */
 
-static int
+static enum req_fsm_nxt
 cnt_deliver(struct worker *wrk, struct req *req)
 {
 	struct busyobj *bo;
@@ -219,7 +219,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
 			VBO_DerefBusyObj(wrk, &req->busyobj);
 			req->err_code = 503;
 			req->req_step = R_STP_ERROR;
-			return (0);
+			return (REQ_FSM_MORE);
 		}
 		VBO_DerefBusyObj(wrk, &req->busyobj);
 	}
@@ -237,7 +237,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
 	assert(WRW_IsReleased(wrk));
 	(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
 	http_Teardown(req->resp);
-	return (1);
+	return (REQ_FSM_DONE);
 }
 /*--------------------------------------------------------------------
  * Emit an error
@@ -254,7 +254,7 @@ DOT vcl_error-> rsterr [label="restart",color=purple]
 DOT rsterr [label="RESTART",shape=plaintext]
  */
 
-static int
+static enum req_fsm_nxt
 cnt_error(struct worker *wrk, struct req *req)
 {
 	struct http *h;
@@ -281,7 +281,7 @@ cnt_error(struct worker *wrk, struct req *req)
 		req->director = NULL;
 		http_Teardown(bo->beresp);
 		http_Teardown(bo->bereq);
-		return(1);
+		return (REQ_FSM_DONE);
 	}
 	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 	req->obj->vxid = bo->vsl->wid;
@@ -309,7 +309,7 @@ cnt_error(struct worker *wrk, struct req *req)
 		HSH_Drop(wrk, &req->obj);
 		VBO_DerefBusyObj(wrk, &req->busyobj);
 		req->req_step = R_STP_RESTART;
-		return (0);
+		return (REQ_FSM_MORE);
 	} else if (req->handling == VCL_RET_RESTART)
 		req->handling = VCL_RET_DELIVER;
 
@@ -324,7 +324,7 @@ cnt_error(struct worker *wrk, struct req *req)
 	http_Teardown(bo->bereq);
 	VBO_DerefBusyObj(wrk, &req->busyobj);
 	req->req_step = R_STP_PREPRESP;
-	return (0);
+	return (REQ_FSM_MORE);
 }
 
 /*--------------------------------------------------------------------
@@ -340,7 +340,7 @@ DOT fetch -> fetchbody [style=bold,color=red]
 DOT fetch -> fetchbody [style=bold,color=blue]
  */
 
-static int
+static enum req_fsm_nxt
 cnt_fetch(struct worker *wrk, struct req *req)
 {
 	int i, need_host_hdr;
@@ -418,7 +418,7 @@ cnt_fetch(struct worker *wrk, struct req *req)
 		switch (req->handling) {
 		case VCL_RET_DELIVER:
 			req->req_step = R_STP_FETCHBODY;
-			return (0);
+			return (REQ_FSM_MORE);
 		default:
 			break;
 		}
@@ -446,10 +446,10 @@ cnt_fetch(struct worker *wrk, struct req *req)
 	switch (req->handling) {
 	case VCL_RET_RESTART:
 		req->req_step = R_STP_RESTART;
-		return (0);
+		return (REQ_FSM_MORE);
 	case VCL_RET_ERROR:
 		req->req_step = R_STP_ERROR;
-		return (0);
+		return (REQ_FSM_MORE);
 	default:
 		WRONG("Illegal action in vcl_fetch{}");
 	}
@@ -468,7 +468,7 @@ DOT fetchbody:out -> prepresp [style=bold,color=red]
 DOT fetchbody:out -> prepresp [style=bold,color=blue]
  */
 
-static int
+static enum req_fsm_nxt
 cnt_fetchbody(struct worker *wrk, struct req *req)
 {
 	struct http *hp, *hp2;
@@ -606,7 +606,7 @@ cnt_fetchbody(struct worker *wrk, struct req *req)
 		req->req_step = R_STP_ERROR;
 		VDI_CloseFd(&bo->vbc);
 		VBO_DerefBusyObj(wrk, &req->busyobj);
-		return (0);
+		return (REQ_FSM_MORE);
 	}
 	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 
@@ -685,12 +685,12 @@ cnt_fetchbody(struct worker *wrk, struct req *req)
 		VBO_DerefBusyObj(wrk, &req->busyobj);
 		req->err_code = 503;
 		req->req_step = R_STP_ERROR;
-		return (0);
+		return (REQ_FSM_MORE);
 	}
 
 	assert(WRW_IsReleased(wrk));
 	req->req_step = R_STP_PREPRESP;
-	return (0);
+	return (REQ_FSM_MORE);
 }
 
 /*--------------------------------------------------------------------
@@ -711,7 +711,7 @@ DOT hit:pass -> pass [label=pass,style=bold,color=red]
 DOT hit:del -> prepresp [label="deliver",style=bold,color=green]
  */
 
-static int
+static enum req_fsm_nxt
 cnt_hit(struct worker *wrk, struct req *req)
 {
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
@@ -731,7 +731,7 @@ cnt_hit(struct worker *wrk, struct req *req)
 		//AZ(req->busyobj->beresp->ws);
 		(void)HTTP1_DiscardReqBody(req);	// XXX: handle err
 		req->req_step = R_STP_PREPRESP;
-		return (0);
+		return (REQ_FSM_MORE);
 	}
 
 	/* Drop our object, we won't need it */
@@ -741,13 +741,13 @@ cnt_hit(struct worker *wrk, struct req *req)
 	switch(req->handling) {
 	case VCL_RET_PASS:
 		req->req_step = R_STP_PASS;
-		return (0);
+		return (REQ_FSM_MORE);
 	case VCL_RET_ERROR:
 		req->req_step = R_STP_ERROR;
-		return (0);
+		return (REQ_FSM_MORE);
 	case VCL_RET_RESTART:
 		req->req_step = R_STP_RESTART;
-		return (0);
+		return (REQ_FSM_MORE);
 	default:
 		WRONG("Illegal action in vcl_hit{}");
 	}
@@ -772,7 +772,7 @@ DOT lookup:no -> hit [style=bold,color=green]
 DOT lookup:yes -> pass [style=bold,color=red]
  */
 
-static int
+static enum req_fsm_nxt
 cnt_lookup(struct worker *wrk, struct req *req)
 {
 	struct objcore *oc;
@@ -798,7 +798,7 @@ cnt_lookup(struct worker *wrk, struct req *req)
 		 * object has been unbusied, and still have the objhead
 		 * around to restart the lookup with.
 		 */
-		return (2);
+		return (REQ_FSM_DISEMBARK);
 	}
 	AZ(req->objcore);
 
@@ -820,7 +820,7 @@ cnt_lookup(struct worker *wrk, struct req *req)
 
 		req->objcore = oc;
 		req->req_step = R_STP_MISS;
-		return (0);
+		return (REQ_FSM_MORE);
 	}
 
 	/* We are not prepared to do streaming yet */
@@ -838,13 +838,13 @@ cnt_lookup(struct worker *wrk, struct req *req)
 		(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
 		AZ(req->objcore);
 		req->req_step = R_STP_PASS;
-		return (0);
+		return (REQ_FSM_MORE);
 	}
 
 	wrk->stats.cache_hit++;
 	VSLb(req->vsl, SLT_Hit, "%u", req->obj->vxid);
 	req->req_step = R_STP_HIT;
-	return (0);
+	return (REQ_FSM_MORE);
 }
 
 /*--------------------------------------------------------------------
@@ -861,7 +861,7 @@ DOT miss:pass -> pass [label="pass",style=bold,color=red]
 DOT
  */
 
-static int
+static enum req_fsm_nxt
 cnt_miss(struct worker *wrk, struct req *req)
 {
 	struct busyobj *bo;
@@ -892,7 +892,7 @@ cnt_miss(struct worker *wrk, struct req *req)
 	if (req->handling == VCL_RET_FETCH) {
 		CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 		req->req_step = R_STP_FETCH;
-		return (0);
+		return (REQ_FSM_MORE);
 	}
 
 	AZ(HSH_Deref(&wrk->stats, req->objcore, NULL));
@@ -913,7 +913,7 @@ cnt_miss(struct worker *wrk, struct req *req)
 	default:
 		WRONG("Illegal action in vcl_miss{}");
 	}
-	return (0);
+	return (REQ_FSM_MORE);
 }
 
 /*--------------------------------------------------------------------
@@ -933,7 +933,7 @@ XDOT pass:err -> err_pass [label="error"]
 XDOT err_pass [label="ERROR",shape=plaintext]
  */
 
-static int
+static enum req_fsm_nxt
 cnt_pass(struct worker *wrk, struct req *req)
 {
 	struct busyobj *bo;
@@ -957,7 +957,7 @@ cnt_pass(struct worker *wrk, struct req *req)
 		http_Teardown(bo->bereq);
 		VBO_DerefBusyObj(wrk, &req->busyobj);
 		req->req_step = R_STP_ERROR;
-		return (0);
+		return (REQ_FSM_MORE);
 	}
 	assert(req->handling == VCL_RET_PASS);
 	req->acct_req.pass++;
@@ -965,7 +965,7 @@ cnt_pass(struct worker *wrk, struct req *req)
 
 	req->objcore = HSH_NewObjCore(wrk);
 	req->objcore->busyobj = bo;
-	return (0);
+	return (REQ_FSM_MORE);
 }
 
 /*--------------------------------------------------------------------
@@ -993,7 +993,7 @@ DOT vcl_pipe -> err_pipe [label="error"]
 DOT err_pipe [label="ERROR",shape=plaintext]
  */
 
-static int
+static enum req_fsm_nxt
 cnt_pipe(struct worker *wrk, struct req *req)
 {
 	struct busyobj *bo;
@@ -1019,7 +1019,7 @@ cnt_pipe(struct worker *wrk, struct req *req)
 	assert(WRW_IsReleased(wrk));
 	http_Teardown(bo->bereq);
 	VBO_DerefBusyObj(wrk, &req->busyobj);
-	return (1);
+	return (REQ_FSM_DONE);
 }
 
 /*--------------------------------------------------------------------
@@ -1036,7 +1036,7 @@ DOT restart -> err_restart
 DOT err_restart [label="ERROR",shape=plaintext]
  */
 
-static int
+static enum req_fsm_nxt
 cnt_restart(const struct worker *wrk, struct req *req)
 {
 
@@ -1051,7 +1051,7 @@ cnt_restart(const struct worker *wrk, struct req *req)
 		req->err_code = 0;
 		req->req_step = R_STP_RECV;
 	}
-	return (0);
+	return (REQ_FSM_MORE);
 }
 
 /*--------------------------------------------------------------------
@@ -1080,7 +1080,7 @@ DOT recv:lookup -> hash [style=bold,color=green]
 DOT hash -> lookup [label="hash",style=bold,color=green]
  */
 
-static int
+static enum req_fsm_nxt
 cnt_recv(const struct worker *wrk, struct req *req)
 {
 	unsigned recv_handling;
@@ -1098,7 +1098,7 @@ cnt_recv(const struct worker *wrk, struct req *req)
 
 	if (req->err_code) {
 		req->req_step = R_STP_ERROR;
-		return (0);
+		return (REQ_FSM_MORE);
 	}
 
 	/* By default we use the first backend */
@@ -1144,21 +1144,21 @@ cnt_recv(const struct worker *wrk, struct req *req)
 	switch(recv_handling) {
 	case VCL_RET_LOOKUP:
 		req->req_step = R_STP_LOOKUP;
-		return (0);
+		return (REQ_FSM_MORE);
 	case VCL_RET_PIPE:
 		if (req->esi_level > 0) {
 			/* XXX: VSL something */
 			INCOMPL();
-			return (1);
+			return (REQ_FSM_DONE);
 		}
 		req->req_step = R_STP_PIPE;
-		return (0);
+		return (REQ_FSM_MORE);
 	case VCL_RET_PASS:
 		req->req_step = R_STP_PASS;
-		return (0);
+		return (REQ_FSM_MORE);
 	case VCL_RET_ERROR:
 		req->req_step = R_STP_ERROR;
-		return (0);
+		return (REQ_FSM_MORE);
 	default:
 		WRONG("Illegal action in vcl_recv{}");
 	}
@@ -1182,10 +1182,10 @@ cnt_diag(struct req *req, const char *state)
 	VSL_Flush(req->vsl, 0);
 }
 
-int
+enum req_fsm_nxt
 CNT_Request(struct worker *wrk, struct req *req)
 {
-	int done;
+	enum req_fsm_nxt nxt;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -1201,7 +1201,7 @@ CNT_Request(struct worker *wrk, struct req *req)
 
 	req->wrk = wrk;
 
-	for (done = 0; !done; ) {
+	for (nxt = REQ_FSM_MORE; nxt == REQ_FSM_MORE; ) {
 		/*
 		 * This is a good place to be paranoid about the various
 		 * pointers still pointing to the things we expect.
@@ -1223,7 +1223,7 @@ CNT_Request(struct worker *wrk, struct req *req)
 		    case R_STP_##u: \
 			if (DO_DEBUG(DBG_REQ_STATE)) \
 				cnt_diag(req, #u); \
-			done = cnt_##l arg; \
+			nxt = cnt_##l arg; \
 		        break;
 #include "tbl/steps.h"
 #undef REQ_STEP
@@ -1233,7 +1233,7 @@ CNT_Request(struct worker *wrk, struct req *req)
 		WS_Assert(wrk->aws);
 		CHECK_OBJ_ORNULL(wrk->nobjhead, OBJHEAD_MAGIC);
 	}
-	if (done == 1) {
+	if (nxt == REQ_FSM_DONE) {
 		/* XXX: Workaround for pipe */
 		if (req->sp->fd >= 0) {
 			VSLb(req->vsl, SLT_Length, "%ju",
@@ -1259,7 +1259,7 @@ CNT_Request(struct worker *wrk, struct req *req)
 	req->wrk = NULL;
 
 	assert(WRW_IsReleased(wrk));
-	return (done);
+	return (nxt);
 }
 
 /*



More information about the varnish-commit mailing list