[master] 8bebce8 Use VTLA VWK for Kqueue waiter and make it an object

Poul-Henning Kamp phk at varnish-cache.org
Sat Sep 17 12:46:52 CEST 2011


commit 8bebce803ffe25049fa4c5694dcc4b642f5155f6
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Sat Sep 17 10:46:30 2011 +0000

    Use VTLA VWK for Kqueue waiter and make it an object

diff --git a/bin/varnishd/cache_waiter.h b/bin/varnishd/cache_waiter.h
index 9d6eee9..9bf139c 100644
--- a/bin/varnishd/cache_waiter.h
+++ b/bin/varnishd/cache_waiter.h
@@ -31,7 +31,7 @@
 struct sess;
 
 typedef void* waiter_init_f(void);
-typedef void waiter_pass_f(void *priv, struct sess *);
+typedef void waiter_pass_f(void *priv, const struct sess *);
 
 extern int vca_pipes[2];
 
diff --git a/bin/varnishd/cache_waiter_epoll.c b/bin/varnishd/cache_waiter_epoll.c
index 5726b03..c405bfc 100644
--- a/bin/varnishd/cache_waiter_epoll.c
+++ b/bin/varnishd/cache_waiter_epoll.c
@@ -222,7 +222,7 @@ vca_sess_timeout_ticker(void *arg)
 /*--------------------------------------------------------------------*/
 
 static void
-vca_epoll_pass(void *priv, hhstruct sess *sp)
+vca_epoll_pass(void *priv, const struct sess *sp)
 {
 
 	(void)priv;
diff --git a/bin/varnishd/cache_waiter_kqueue.c b/bin/varnishd/cache_waiter_kqueue.c
index 12e7bd4..cbea248 100644
--- a/bin/varnishd/cache_waiter_kqueue.c
+++ b/bin/varnishd/cache_waiter_kqueue.c
@@ -47,64 +47,64 @@
 #include "cache.h"
 #include "cache_waiter.h"
 
-
-/*--------------------------------------------------------------------*/
-
-
-static pthread_t vca_kqueue_thread;
-static int kq = -1;
-
-
-static VTAILQ_HEAD(,sess) sesshead = VTAILQ_HEAD_INITIALIZER(sesshead);
-
 #define NKEV	100
 
-static struct kevent ki[NKEV];
-static unsigned nki;
+struct vwk {
+	unsigned		magic;
+#define VWK_MAGIC		0x1cc2acc2
+	pthread_t 		thread;
+	int			pipes[2];
+	int 			kq;
+	struct kevent		ki[NKEV];
+	unsigned		nki;
+	VTAILQ_HEAD(,sess)	sesshead;
+};
+
+/*--------------------------------------------------------------------*/
 
 static void
-vca_kq_flush(void)
+vwk_kq_flush(struct vwk *vwk)
 {
 	int i;
 
-	if (nki == 0)
+	if (vwk->nki == 0)
 		return;
-	i = kevent(kq, ki, nki, NULL, 0, NULL);
+	i = kevent(vwk->kq, vwk->ki, vwk->nki, NULL, 0, NULL);
 	assert(i == 0);
-	nki = 0;
+	vwk->nki = 0;
 }
 
 static void
-vca_kq_sess(struct sess *sp, short arm)
+vwk_kq_sess(struct vwk *vwk, struct sess *sp, short arm)
 {
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 	assert(sp->fd >= 0);
 	DSL(0x04, SLT_Debug, sp->fd, "KQ: EV_SET sp %p arm %x", sp, arm);
-	EV_SET(&ki[nki], sp->fd, EVFILT_READ, arm, 0, 0, sp);
-	if (++nki == NKEV)
-		vca_kq_flush();
+	EV_SET(&vwk->ki[vwk->nki], sp->fd, EVFILT_READ, arm, 0, 0, sp);
+	if (++vwk->nki == NKEV)
+		vwk_kq_flush(vwk);
 }
 
 static void
-vca_kev(const struct kevent *kp)
+vwk_kev(struct vwk *vwk, const struct kevent *kp)
 {
 	int i, j;
 	struct sess *sp;
 	struct sess *ss[NKEV];
 
 	AN(kp->udata);
-	if (kp->udata == vca_pipes) {
+	if (kp->udata == vwk->pipes) {
 		j = 0;
-		i = read(vca_pipes[0], ss, sizeof ss);
+		i = read(vwk->pipes[0], ss, sizeof ss);
 		if (i == -1 && errno == EAGAIN)
 			return;
 		while (i >= sizeof ss[0]) {
 			CHECK_OBJ_NOTNULL(ss[j], SESS_MAGIC);
 			assert(ss[j]->fd >= 0);
 			AZ(ss[j]->obj);
-			VTAILQ_INSERT_TAIL(&sesshead, ss[j], list);
-			vca_kq_sess(ss[j], EV_ADD | EV_ONESHOT);
+			VTAILQ_INSERT_TAIL(&vwk->sesshead, ss[j], list);
+			vwk_kq_sess(vwk, ss[j], EV_ADD | EV_ONESHOT);
 			j++;
 			i -= sizeof ss[0];
 		}
@@ -121,14 +121,14 @@ vca_kev(const struct kevent *kp)
 	if (kp->data > 0) {
 		i = HTC_Rx(sp->htc);
 		if (i == 0) {
-			vca_kq_sess(sp, EV_ADD | EV_ONESHOT);
+			vwk_kq_sess(vwk, sp, EV_ADD | EV_ONESHOT);
 			return;	/* more needed */
 		}
-		VTAILQ_REMOVE(&sesshead, sp, list);
+		VTAILQ_REMOVE(&vwk->sesshead, sp, list);
 		vca_handover(sp, i);
 		return;
 	} else if (kp->flags & EV_EOF) {
-		VTAILQ_REMOVE(&sesshead, sp, list);
+		VTAILQ_REMOVE(&vwk->sesshead, sp, list);
 		vca_close_session(sp, "EOF");
 		SES_Delete(sp);
 		return;
@@ -142,39 +142,40 @@ vca_kev(const struct kevent *kp)
 /*--------------------------------------------------------------------*/
 
 static void *
-vca_kqueue_main(void *arg)
+vwk_thread(void *priv)
 {
+	struct vwk *vwk;
 	struct kevent ke[NKEV], *kp;
 	int j, n, dotimer;
 	double deadline;
 	struct sess *sp;
 
+	CAST_OBJ_NOTNULL(vwk, priv, VWK_MAGIC);
 	THR_SetName("cache-kqueue");
-	(void)arg;
 
-	kq = kqueue();
-	assert(kq >= 0);
+	vwk->kq = kqueue();
+	assert(vwk->kq >= 0);
 
 	j = 0;
 	EV_SET(&ke[j], 0, EVFILT_TIMER, EV_ADD, 0, 100, NULL);
 	j++;
-	EV_SET(&ke[j], vca_pipes[0], EVFILT_READ, EV_ADD, 0, 0, vca_pipes);
+	EV_SET(&ke[j], vwk->pipes[0], EVFILT_READ, EV_ADD, 0, 0, vwk->pipes);
 	j++;
-	AZ(kevent(kq, ke, j, NULL, 0, NULL));
+	AZ(kevent(vwk->kq, ke, j, NULL, 0, NULL));
 
-	nki = 0;
+	vwk->nki = 0;
 	while (1) {
 		dotimer = 0;
-		n = kevent(kq, ki, nki, ke, NKEV, NULL);
+		n = kevent(vwk->kq, vwk->ki, vwk->nki, ke, NKEV, NULL);
 		assert(n >= 1 && n <= NKEV);
-		nki = 0;
+		vwk->nki = 0;
 		for (kp = ke, j = 0; j < n; j++, kp++) {
 			if (kp->filter == EVFILT_TIMER) {
 				dotimer = 1;
 				continue;
 			}
 			assert(kp->filter == EVFILT_READ);
-			vca_kev(kp);
+			vwk_kev(vwk, kp);
 		}
 		if (!dotimer)
 			continue;
@@ -185,15 +186,15 @@ vca_kqueue_main(void *arg)
 		 * the kevent(2) at the top of this loop, the kernel
 		 * would not know we meant "the old fd of this number".
 		 */
-		vca_kq_flush();
+		vwk_kq_flush(vwk);
 		deadline = TIM_real() - params->sess_timeout;
 		for (;;) {
-			sp = VTAILQ_FIRST(&sesshead);
+			sp = VTAILQ_FIRST(&vwk->sesshead);
 			if (sp == NULL)
 				break;
 			if (sp->t_open > deadline)
 				break;
-			VTAILQ_REMOVE(&sesshead, sp, list);
+			VTAILQ_REMOVE(&vwk->sesshead, sp, list);
 			// XXX: not yet (void)VTCP_linger(sp->fd, 0);
 			vca_close_session(sp, "timeout");
 			SES_Delete(sp);
@@ -204,11 +205,12 @@ vca_kqueue_main(void *arg)
 /*--------------------------------------------------------------------*/
 
 static void
-vca_kqueue_pass(void *priv, struct sess *sp)
+vca_kqueue_pass(void *priv, const struct sess *sp)
 {
+	struct vwk *vwk;
 
-	(void)priv;
-	assert(sizeof sp == write(vca_pipes[1], &sp, sizeof sp));
+	CAST_OBJ_NOTNULL(vwk, priv, VWK_MAGIC);
+	assert(sizeof sp == write(vwk->pipes[1], &sp, sizeof sp));
 }
 
 /*--------------------------------------------------------------------*/
@@ -217,15 +219,22 @@ static void *
 vca_kqueue_init(void)
 {
 	int i;
+	struct vwk *vwk;
+
+	ALLOC_OBJ(vwk, VWK_MAGIC);
+	AN(vwk);
+
+	VTAILQ_INIT(&vwk->sesshead);
+	AZ(pipe(vwk->pipes));
 
-	i = fcntl(vca_pipes[0], F_GETFL);
+	i = fcntl(vwk->pipes[0], F_GETFL);
 	assert(i != -1);
 	i |= O_NONBLOCK;
-	i = fcntl(vca_pipes[0], F_SETFL, i);
+	i = fcntl(vwk->pipes[0], F_SETFL, i);
 	assert(i != -1);
 
-	AZ(pthread_create(&vca_kqueue_thread, NULL, vca_kqueue_main, NULL));
-	return (NULL);
+	AZ(pthread_create(&vwk->thread, NULL, vwk_thread, vwk));
+	return (vwk);
 }
 
 /*--------------------------------------------------------------------*/
diff --git a/bin/varnishd/cache_waiter_poll.c b/bin/varnishd/cache_waiter_poll.c
index 44b4033..c51776d 100644
--- a/bin/varnishd/cache_waiter_poll.c
+++ b/bin/varnishd/cache_waiter_poll.c
@@ -201,7 +201,7 @@ vwp_main(void *priv)
 /*--------------------------------------------------------------------*/
 
 static void
-vwp_poll_pass(void *priv, struct sess *sp)
+vwp_poll_pass(void *priv, const struct sess *sp)
 {
 	struct vwp *vwp;
 
diff --git a/bin/varnishd/cache_waiter_ports.c b/bin/varnishd/cache_waiter_ports.c
index f1cc55c..6a587cc 100644
--- a/bin/varnishd/cache_waiter_ports.c
+++ b/bin/varnishd/cache_waiter_ports.c
@@ -246,7 +246,7 @@ vca_main(void *arg)
 /*--------------------------------------------------------------------*/
 
 static void
-vca_ports_pass(void *priv, struct sess *sp)
+vca_ports_pass(void *priv, const struct sess *sp)
 {
 	int r;
 



More information about the varnish-commit mailing list