Commit a5708d52 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Minor reorg of kqueue waiter for improved clarity

parent 23b1f977
...@@ -86,30 +86,41 @@ vwk_kq_sess(struct vwk *vwk, struct sess *sp, short arm) ...@@ -86,30 +86,41 @@ vwk_kq_sess(struct vwk *vwk, struct sess *sp, short arm)
vwk_kq_flush(vwk); vwk_kq_flush(vwk);
} }
/*--------------------------------------------------------------------*/
static void static void
vwk_kev(struct vwk *vwk, const struct kevent *kp) vwk_pipe_ev(struct vwk *vwk, const struct kevent *kp)
{ {
int i, j; int i, j;
struct sess *sp;
struct sess *ss[NKEV]; struct sess *ss[NKEV];
AN(kp->udata); AN(kp->udata);
if (kp->udata == vwk->pipes) { assert(kp->udata == vwk->pipes);
j = 0; j = 0;
i = read(vwk->pipes[0], ss, sizeof ss); i = read(vwk->pipes[0], ss, sizeof ss);
if (i == -1 && errno == EAGAIN) if (i == -1 && errno == EAGAIN)
return;
while (i >= sizeof ss[0]) {
CHECK_OBJ_NOTNULL(ss[j], SESS_MAGIC);
assert(ss[j]->fd >= 0);
VTAILQ_INSERT_TAIL(&vwk->sesshead, ss[j], list);
vwk_kq_sess(vwk, ss[j], EV_ADD | EV_ONESHOT);
j++;
i -= sizeof ss[0];
}
assert(i == 0);
return; return;
while (i >= sizeof ss[0]) {
CHECK_OBJ_NOTNULL(ss[j], SESS_MAGIC);
assert(ss[j]->fd >= 0);
VTAILQ_INSERT_TAIL(&vwk->sesshead, ss[j], list);
vwk_kq_sess(vwk, ss[j], EV_ADD | EV_ONESHOT);
j++;
i -= sizeof ss[0];
} }
assert(i == 0);
}
/*--------------------------------------------------------------------*/
static void
vwk_sess_ev(struct vwk *vwk, const struct kevent *kp)
{
int i;
struct sess *sp;
AN(kp->udata);
assert(kp->udata != vwk->pipes);
CAST_OBJ_NOTNULL(sp, kp->udata, SESS_MAGIC); CAST_OBJ_NOTNULL(sp, kp->udata, SESS_MAGIC);
DSL(0x04, SLT_Debug, sp->vsl_id, "KQ: sp %p kev data %lu flags 0x%x%s", DSL(0x04, SLT_Debug, sp->vsl_id, "KQ: sp %p kev data %lu flags 0x%x%s",
sp, (unsigned long)kp->data, kp->flags, sp, (unsigned long)kp->data, kp->flags,
...@@ -171,10 +182,13 @@ vwk_thread(void *priv) ...@@ -171,10 +182,13 @@ vwk_thread(void *priv)
for (kp = ke, j = 0; j < n; j++, kp++) { for (kp = ke, j = 0; j < n; j++, kp++) {
if (kp->filter == EVFILT_TIMER) { if (kp->filter == EVFILT_TIMER) {
dotimer = 1; dotimer = 1;
continue; } else if (kp->filter == EVFILT_READ &&
kp->udata == vwk->pipes) {
vwk_pipe_ev(vwk, kp);
} else {
assert(kp->filter == EVFILT_READ);
vwk_sess_ev(vwk, kp);
} }
assert(kp->filter == EVFILT_READ);
vwk_kev(vwk, kp);
} }
if (!dotimer) if (!dotimer)
continue; continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment