[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