[master] 606b6f0 But we can do without the struct pool_task in struct sess, because we can reserve the space on the workspace when needed.

Poul-Henning Kamp phk at FreeBSD.org
Tue Mar 17 20:57:56 CET 2015


commit 606b6f0decf24276e88cdd395963dcd2caf34a40
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Mar 17 19:57:18 2015 +0000

    But we can do without the struct pool_task in struct sess, because
    we can reserve the space on the workspace when needed.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 1e43663..cceb572 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -657,7 +657,6 @@ struct sess {
 
 	struct sesspool		*sesspool;
 
-	struct pool_task	task;
 	struct waited		waited;
 
 	/* Session related fields ------------------------------------*/
diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index 8bfda98..d382157 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -360,6 +360,8 @@ vca_make_session(struct worker *wrk, void *arg)
 	    sp->client_addr_str, sp->client_port_str, lsockname, laddr, lport,
 	    sp->t_open, sp->fd);
 
+	/* SES_sess_pool_task() must be sceduled with reserved WS */
+	assert(8 == WS_Reserve(sp->ws, 8));
 	wrk->task.func = SES_sess_pool_task;
 	wrk->task.priv = sp;
 }
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 896f1b1..724c9e1 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -132,6 +132,7 @@ SES_sess_pool_task(struct worker *wrk, void *arg)
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CAST_OBJ_NOTNULL(sp, arg, SESS_MAGIC);
+	WS_Release(sp->ws, 0);
 
 	req = SES_GetReq(wrk, sp);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -176,10 +177,13 @@ ses_handle(struct waited *wp, enum wait_event ev, double now)
 {
 	struct sess *sp;
 	struct sesspool *pp;
+	struct pool_task *tp;
 
 	CHECK_OBJ_NOTNULL(wp, WAITED_MAGIC);
 	CAST_OBJ_NOTNULL(sp, wp->ptr, SESS_MAGIC);
 
+	AZ(sp->ws->r);
+
 	switch (ev) {
 	case WAITER_TIMEOUT:
 		SES_Delete(sp, SC_RX_TIMEOUT, now);
@@ -191,9 +195,11 @@ ses_handle(struct waited *wp, enum wait_event ev, double now)
 		pp = sp->sesspool;
 		CHECK_OBJ_NOTNULL(pp, SESSPOOL_MAGIC);
 		AN(pp->pool);
-		sp->task.func = SES_sess_pool_task;
-		sp->task.priv = sp;
-		if (Pool_Task(pp->pool, &sp->task, POOL_QUEUE_FRONT))
+		assert(sizeof *tp == WS_Reserve(sp->ws, sizeof *tp));
+		tp = (void*)sp->ws->f;
+		tp->func = SES_sess_pool_task;
+		tp->priv = sp;
+		if (Pool_Task(pp->pool, tp, POOL_QUEUE_FRONT))
 			SES_Delete(sp, SC_OVERLOAD, now);
 		break;
 	case WAITER_CLOSE:



More information about the varnish-commit mailing list