[master] a67a9d560 Turn pool_task fields into single-element arrays

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Fri Apr 3 12:42:06 UTC 2020


commit a67a9d5606210245dd0c51966698dcd07206c91e
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Fri Apr 3 12:30:11 2020 +0200

    Turn pool_task fields into single-element arrays
    
    That is, when the struct is embedded in another struct. This is a
    mechanical change allowing to always treat tasks like pointers.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index e661804e7..9cb57970c 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -247,7 +247,7 @@ struct worker {
 	struct VSC_main_wrk	*stats;
 	struct vsl_log		*vsl;		// borrowed from req/bo
 
-	struct pool_task	task;
+	struct pool_task	task[1];
 
 	vtim_real		lastused;
 	int			strangelove;
@@ -409,7 +409,7 @@ struct busyobj {
 
 	struct http_conn	*htc;
 
-	struct pool_task	fetch_task;
+	struct pool_task	fetch_task[1];
 
 #define BO_FLAG(l, r, w, d) unsigned	l:1;
 #include "tbl/bo_flags.h"
@@ -471,7 +471,7 @@ struct req {
 
 	struct sess		*sp;
 	struct worker		*wrk;
-	struct pool_task	task;
+	struct pool_task	task[1];
 
 	const struct transport	*transport;
 	void			*transport_priv;
diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index b40987e00..d43144dfc 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -73,7 +73,7 @@ struct poolsock {
 #define POOLSOCK_MAGIC			0x1b0a2d38
 	VTAILQ_ENTRY(poolsock)		list;
 	struct listen_sock		*lsock;
-	struct pool_task		task;
+	struct pool_task		task[1];
 	struct pool			*pool;
 };
 
@@ -525,7 +525,7 @@ vca_accept_task(struct worker *wrk, void *arg)
 			 * taken up by another thread again.
 			 */
 			if (!ps->pool->die) {
-				AZ(Pool_Task(wrk->pool, &ps->task,
+				AZ(Pool_Task(wrk->pool, ps->task,
 				    TASK_QUEUE_VCA));
 				return;
 			}
@@ -554,11 +554,11 @@ VCA_NewPool(struct pool *pp)
 		ALLOC_OBJ(ps, POOLSOCK_MAGIC);
 		AN(ps);
 		ps->lsock = ls;
-		ps->task.func = vca_accept_task;
-		ps->task.priv = ps;
+		ps->task->func = vca_accept_task;
+		ps->task->priv = ps;
 		ps->pool = pp;
 		VTAILQ_INSERT_TAIL(&pp->poolsocks, ps, list);
-		AZ(Pool_Task(pp, &ps->task, TASK_QUEUE_VCA));
+		AZ(Pool_Task(pp, ps->task, TASK_QUEUE_VCA));
 	}
 }
 
diff --git a/bin/varnishd/cache/cache_backend_probe.c b/bin/varnishd/cache/cache_backend_probe.c
index 39bc68196..4db99c2c1 100644
--- a/bin/varnishd/cache/cache_backend_probe.c
+++ b/bin/varnishd/cache/cache_backend_probe.c
@@ -84,7 +84,7 @@ struct vbp_target {
 	vtim_real			due;
 	int				running;
 	int				heap_idx;
-	struct pool_task		task;
+	struct pool_task		task[1];
 };
 
 static struct lock			vbp_mtx;
@@ -485,10 +485,10 @@ vbp_thread(struct worker *wrk, void *priv)
 			vt->due = now + vt->interval;
 			if (!vt->running) {
 				vt->running = 1;
-				vt->task.func = vbp_task;
-				vt->task.priv = vt;
+				vt->task->func = vbp_task;
+				vt->task->priv = vt;
 				Lck_Unlock(&vbp_mtx);
-				r = Pool_Task_Any(&vt->task, TASK_QUEUE_REQ);
+				r = Pool_Task_Any(vt->task, TASK_QUEUE_REQ);
 				Lck_Lock(&vbp_mtx);
 				if (r)
 					vt->running = 0;
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 5319d6a76..f911f7ca7 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -1064,10 +1064,10 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
 	AZ(bo->req);
 	bo->req = req;
 
-	bo->fetch_task.priv = bo;
-	bo->fetch_task.func = vbf_fetch_thread;
+	bo->fetch_task->priv = bo;
+	bo->fetch_task->func = vbf_fetch_thread;
 
-	if (Pool_Task(wrk->pool, &bo->fetch_task, TASK_QUEUE_BO)) {
+	if (Pool_Task(wrk->pool, bo->fetch_task, TASK_QUEUE_BO)) {
 		wrk->stats->fetch_no_thread++;
 		(void)vbf_stp_fail(req->wrk, bo);
 		if (bo->stale_oc != NULL)
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 51d2f972f..831572956 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -634,7 +634,7 @@ hsh_rush2(struct worker *wrk, struct rush *r)
 			 * may be vmod_privs to cleanup and we need a proper
 			 * workerthread for that.
 			 */
-			AZ(Pool_Task(req->sp->pool, &req->task, TASK_QUEUE_RUSH));
+			AZ(Pool_Task(req->sp->pool, req->task, TASK_QUEUE_RUSH));
 		}
 	}
 }
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 8a417fb14..2dd248558 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -73,8 +73,8 @@ SES_SetTransport(struct worker *wrk, struct sess *sp, struct req *req,
 
 	sp->sattr[SA_TRANSPORT] = xp->number;
 	req->transport = xp;
-	wrk->task.func = xp->new_session;
-	wrk->task.priv = req;
+	wrk->task->func = xp->new_session;
+	wrk->task->priv = req;
 }
 
 /*--------------------------------------------------------------------*/
diff --git a/bin/varnishd/cache/cache_wrk.c b/bin/varnishd/cache/cache_wrk.c
index 1d34efe54..54e962cd7 100644
--- a/bin/varnishd/cache/cache_wrk.c
+++ b/bin/varnishd/cache/cache_wrk.c
@@ -209,7 +209,7 @@ pool_getidleworker(struct pool *pp, enum task_prio prio)
 	CAST_OBJ_NOTNULL(wrk, pt->priv, WORKER_MAGIC);
 
 	AN(pp->nidle);
-	VTAILQ_REMOVE(&pp->idle_queue, &wrk->task, list);
+	VTAILQ_REMOVE(&pp->idle_queue, wrk->task, list);
 	pp->nidle--;
 
 	return (wrk);
@@ -244,11 +244,11 @@ Pool_Task_Arg(struct worker *wrk, enum task_prio prio, task_func_t *func,
 		wrk2 = wrk;
 		retval = 0;
 	}
-	AZ(wrk2->task.func);
+	AZ(wrk2->task->func);
 	assert(arg_len <= WS_ReserveSize(wrk2->aws, arg_len));
 	memcpy(wrk2->aws->f, arg, arg_len);
-	wrk2->task.func = func;
-	wrk2->task.priv = wrk2->aws->f;
+	wrk2->task->func = func;
+	wrk2->task->priv = wrk2->aws->f;
 	Lck_Unlock(&pp->mtx);
 	// see signaling_note at the top for explanation
 	if (retval)
@@ -287,9 +287,9 @@ Pool_Task(struct pool *pp, struct pool_task *task, enum task_prio prio)
 
 	wrk = pool_getidleworker(pp, prio);
 	if (wrk != NULL) {
-		AZ(wrk->task.func);
-		wrk->task.func = task->func;
-		wrk->task.priv = task->priv;
+		AZ(wrk->task->func);
+		wrk->task->func = task->func;
+		wrk->task->priv = task->priv;
 		Lck_Unlock(&pp->mtx);
 		// see signaling_note at the top for explanation
 		AZ(pthread_cond_signal(&wrk->cond));
@@ -383,9 +383,9 @@ Pool_Work_Thread(struct pool *pp, struct worker *wrk)
 			/* Nothing to do: To sleep, perchance to dream ... */
 			if (isnan(wrk->lastused))
 				wrk->lastused = VTIM_real();
-			wrk->task.func = NULL;
-			wrk->task.priv = wrk;
-			VTAILQ_INSERT_HEAD(&pp->idle_queue, &wrk->task, list);
+			wrk->task->func = NULL;
+			wrk->task->priv = wrk;
+			VTAILQ_INSERT_HEAD(&pp->idle_queue, wrk->task, list);
 			pp->nidle++;
 			do {
 				// see signaling_note at the top for explanation
@@ -398,8 +398,8 @@ Pool_Work_Thread(struct pool *pp, struct worker *wrk)
 				i = Lck_CondWait(&wrk->cond, &pp->mtx, tmo);
 				if (i == ETIMEDOUT)
 					VCL_Rel(&wrk->vcl);
-			} while (wrk->task.func == NULL);
-			tpx = wrk->task;
+			} while (wrk->task->func == NULL);
+			tpx = *wrk->task;
 			tp = &tpx;
 			wrk->stats->summs++;
 		}
@@ -414,7 +414,7 @@ Pool_Work_Thread(struct pool *pp, struct worker *wrk)
 			tp->func(wrk, tp->priv);
 			if (DO_DEBUG(DBG_VCLREL) && wrk->vcl != NULL)
 				VCL_Rel(&wrk->vcl);
-			tpx = wrk->task;
+			tpx = *wrk->task;
 			tp = &tpx;
 		} while (tp->func != NULL);
 
@@ -586,9 +586,9 @@ pool_herder(void *priv)
 				    pp->nthr > cache_param->wthread_max) {
 					/* Give it a kiss on the cheek... */
 					VTAILQ_REMOVE(&pp->idle_queue,
-					    &wrk->task, list);
+					    wrk->task, list);
 					pp->nidle--;
-					wrk->task.func = pool_kiss_of_death;
+					wrk->task->func = pool_kiss_of_death;
 					AZ(pthread_cond_signal(&wrk->cond));
 				} else {
 					delay = wrk->lastused - t_idle;
diff --git a/bin/varnishd/http1/cache_http1_fsm.c b/bin/varnishd/http1/cache_http1_fsm.c
index 67ab7016b..ff4aaa72b 100644
--- a/bin/varnishd/http1/cache_http1_fsm.c
+++ b/bin/varnishd/http1/cache_http1_fsm.c
@@ -124,8 +124,8 @@ http1_new_session(struct worker *wrk, void *arg)
 		return;
 	}
 	http1_setstate(sp, H1NEWREQ);
-	wrk->task.func = http1_req;
-	wrk->task.priv = req;
+	wrk->task->func = http1_req;
+	wrk->task->priv = req;
 }
 
 static void v_matchproto_(task_func_t)
@@ -142,8 +142,8 @@ http1_unwait(struct worker *wrk, void *arg)
 	req->htc->rfd = &sp->fd;
 	HTC_RxInit(req->htc, req->ws);
 	http1_setstate(sp, H1NEWREQ);
-	wrk->task.func = http1_req;
-	wrk->task.priv = req;
+	wrk->task->func = http1_req;
+	wrk->task->priv = req;
 }
 
 static void v_matchproto_(vtr_req_body_t)
@@ -392,8 +392,8 @@ HTTP1_Session(struct worker *wrk, struct req *req)
 			req->req_step = R_STP_TRANSPORT;
 			http1_setstate(sp, H1PROC);
 		} else if (st == H1PROC) {
-			req->task.func = http1_req;
-			req->task.priv = req;
+			req->task->func = http1_req;
+			req->task->priv = req;
 			wrk->stats->client_req++;
 			CNT_Embark(wrk, req);
 			if (req->req_step == R_STP_TRANSPORT) {
@@ -403,8 +403,8 @@ HTTP1_Session(struct worker *wrk, struct req *req)
 			if (CNT_Request(req) == REQ_FSM_DISEMBARK)
 				return;
 			AZ(req->top->vcl0);
-			req->task.func = NULL;
-			req->task.priv = NULL;
+			req->task->func = NULL;
+			req->task->priv = NULL;
 			AZ(req->ws->r);
 			AZ(wrk->aws->r);
 			http1_setstate(sp, H1CLEANUP);
diff --git a/bin/varnishd/http2/cache_http2_proto.c b/bin/varnishd/http2/cache_http2_proto.c
index 317b3287b..704b5cc94 100644
--- a/bin/varnishd/http2/cache_http2_proto.c
+++ b/bin/varnishd/http2/cache_http2_proto.c
@@ -598,10 +598,10 @@ h2_end_headers(struct worker *wrk, struct h2_sess *h2,
 	AN(req->http->hd[HTTP_HDR_PROTO].b);
 
 	req->req_step = R_STP_TRANSPORT;
-	req->task.func = h2_do_req;
-	req->task.priv = req;
+	req->task->func = h2_do_req;
+	req->task->priv = req;
 	r2->scheduled = 1;
-	if (Pool_Task(wrk->pool, &req->task, TASK_QUEUE_STR) != 0) {
+	if (Pool_Task(wrk->pool, req->task, TASK_QUEUE_STR) != 0) {
 		r2->scheduled = 0;
 		r2->state = H2_S_CLOSED;
 		return (H2SE_REFUSED_STREAM); //rfc7540,l,3326,3329
diff --git a/bin/varnishd/http2/cache_http2_session.c b/bin/varnishd/http2/cache_http2_session.c
index 543eea868..571a42843 100644
--- a/bin/varnishd/http2/cache_http2_session.c
+++ b/bin/varnishd/http2/cache_http2_session.c
@@ -278,8 +278,8 @@ h2_ou_session(struct worker *wrk, struct h2_sess *h2,
 	r2 = h2_new_req(wrk, h2, 1, req);
 	req->transport = &H2_transport;
 	req->req_step = R_STP_TRANSPORT;
-	req->task.func = h2_do_req;
-	req->task.priv = req;
+	req->task->func = h2_do_req;
+	req->task->priv = req;
 	r2->scheduled = 1;
 	r2->state = H2_S_CLOS_REM; // rfc7540,l,489,491
 	req->err_code = 0;
@@ -295,7 +295,7 @@ h2_ou_session(struct worker *wrk, struct h2_sess *h2,
 		h2_del_req(wrk, r2);
 		return (0);
 	}
-	if (Pool_Task(wrk->pool, &req->task, TASK_QUEUE_REQ)) {
+	if (Pool_Task(wrk->pool, req->task, TASK_QUEUE_REQ)) {
 		r2->scheduled = 0;
 		h2_del_req(wrk, r2);
 		VSLb(h2->vsl, SLT_Debug, "H2: No Worker-threads");


More information about the varnish-commit mailing list