]> err.no Git - varnish/commitdiff
Close another tiny race.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sun, 20 Aug 2006 19:55:55 +0000 (19:55 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sun, 20 Aug 2006 19:55:55 +0000 (19:55 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@858 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache_acceptor.c

index 9ca05c5a128f0ededa1f93b01ab1296743fb7709..525a8aa2a995383e20fa6844cc0684e1ff798b2c 100644 (file)
@@ -394,21 +394,26 @@ static void
 vca_kq_sess(struct sess *sp, int arm)
 {
        struct kevent ke[2];
-       int i, j;
+       int i, j, arm2;
 
        CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
        memset(ke, 0, sizeof ke);
        j = 0;
-       /* close(2) automatically removes the EVFILT_READ event */
-       if (sp->fd >= 0)
-               EV_SET(&ke[j++], sp->fd, EVFILT_READ, arm, 0, 0, sp);
-       EV_SET(&ke[j++], sp->id, EVFILT_TIMER | EV_ONESHOT,
-           arm == EV_ADD || arm == EV_ENABLE ? EV_ADD : EV_DELETE,
-           0, params->sess_timeout * 1000, sp);
-       if (arm == EV_ADD || arm == EV_ENABLE)
+       if (arm == EV_ADD || arm == EV_ENABLE) {
+               assert(sp->kqa == 0);
                sp->kqa = 1;
-       else 
+               arm2 = EV_ADD;
+       } else  {
+               assert(sp->kqa == 1);
                sp->kqa = 0;
+               arm2 = EV_DELETE;
+       }
+       EV_SET(&ke[j++], sp->id, EVFILT_TIMER, arm2,
+           0, params->sess_timeout * 1000, sp);
+       j = 0;
+       if (sp->fd >= 0)
+               EV_SET(&ke[j++], sp->fd, EVFILT_READ, arm, 0, 0, sp);
+
        i = kevent(kq, ke, j, NULL, 0, NULL);
        assert(i == 0);
 }
@@ -440,7 +445,7 @@ vca_kev(struct kevent *kp)
        }
        CAST_OBJ_NOTNULL(sp, kp->udata, SESS_MAGIC);
        if (sp->kqa == 0) {
-               VSL(SLT_Debug, sp->fd,
+               VSL(SLT_Debug, sp->id,
                    "KQ %s flags %x fflags %x data %x",
                    kp->filter == EVFILT_READ ? "R" : "T",
                    kp->flags, kp->fflags, kp->data);