[master] 50c9933 Improved shutdown
Poul-Henning Kamp
phk at FreeBSD.org
Thu May 21 22:33:07 CEST 2015
commit 50c99336332e9f9590756f2a47d4e222a4ef8ca3
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu May 21 20:32:59 2015 +0000
Improved shutdown
diff --git a/bin/varnishd/waiter/cache_waiter_kqueue.c b/bin/varnishd/waiter/cache_waiter_kqueue.c
index e7dfdcf..34aae98 100644
--- a/bin/varnishd/waiter/cache_waiter_kqueue.c
+++ b/bin/varnishd/waiter/cache_waiter_kqueue.c
@@ -55,6 +55,7 @@ struct vwk {
VTAILQ_HEAD(,waited) list;
struct lock mtx;
+ int die;
};
/*--------------------------------------------------------------------*/
@@ -78,45 +79,44 @@ vwk_thread(void *priv)
ts.tv_sec = (time_t)floor(now);
ts.tv_nsec = (long)(1e9 * (now - ts.tv_sec));
n = kevent(vwk->kq, NULL, 0, ke, NKEV, &ts);
- if (n < 0 && errno == EBADF)
+ if (n < 0 && vwk->die)
break;
+ assert(n >= 0);
assert(n <= NKEV);
now = VTIM_real();
- idle = now - *vwk->waiter->tmo;
for (kp = ke, j = 0; j < n; j++, kp++) {
assert(kp->filter == EVFILT_READ);
CAST_OBJ_NOTNULL(wp, ke[j].udata, WAITED_MAGIC);
Lck_Lock(&vwk->mtx);
VTAILQ_REMOVE(&vwk->list, wp, list);
Lck_Unlock(&vwk->mtx);
- if (wp->idle <= idle)
- vwk->waiter->func(wp, WAITER_TIMEOUT, now);
- else if (kp->flags & EV_EOF)
+ if (kp->flags & EV_EOF)
vwk->waiter->func(wp, WAITER_REMCLOSE, now);
else
vwk->waiter->func(wp, WAITER_ACTION, now);
}
- if (now - last_idle > .3 * *vwk->waiter->tmo) {
- last_idle = now;
- n = 0;
- Lck_Lock(&vwk->mtx);
- VTAILQ_FOREACH_SAFE(wp, &vwk->list, list, wp2) {
- if (wp->idle > idle)
- continue;
- EV_SET(ke + n, wp->fd,
- EVFILT_READ, EV_DELETE, 0, 0, wp);
- if (++n == NKEV)
- break;
- }
- if (n > 0)
- AZ(kevent(vwk->kq, ke, n, NULL, 0, NULL));
- for (j = 0; j < n; j++) {
- CAST_OBJ_NOTNULL(wp, ke[j].udata, WAITED_MAGIC);
- VTAILQ_REMOVE(&vwk->list, wp, list);
- vwk->waiter->func(wp, WAITER_TIMEOUT, now);
- }
- Lck_Unlock(&vwk->mtx);
+ idle = now - *vwk->waiter->tmo;
+ if (now - last_idle < .3 * *vwk->waiter->tmo)
+ continue;
+ last_idle = now;
+ n = 0;
+ Lck_Lock(&vwk->mtx);
+ VTAILQ_FOREACH_SAFE(wp, &vwk->list, list, wp2) {
+ if (wp->idle > idle)
+ continue;
+ EV_SET(ke + n, wp->fd,
+ EVFILT_READ, EV_DELETE, 0, 0, wp);
+ if (++n == NKEV)
+ break;
}
+ if (n > 0)
+ AZ(kevent(vwk->kq, ke, n, NULL, 0, NULL));
+ for (j = 0; j < n; j++) {
+ CAST_OBJ_NOTNULL(wp, ke[j].udata, WAITED_MAGIC);
+ VTAILQ_REMOVE(&vwk->list, wp, list);
+ vwk->waiter->func(wp, WAITER_TIMEOUT, now);
+ }
+ Lck_Unlock(&vwk->mtx);
}
return(NULL);
}
@@ -168,6 +168,7 @@ vwk_fini(struct waiter *w)
{
struct vwk *vwk;
void *vp;
+ int i;
CAST_OBJ_NOTNULL(vwk, w->priv, VWK_MAGIC);
Lck_Lock(&vwk->mtx);
@@ -176,8 +177,10 @@ vwk_fini(struct waiter *w)
(void)usleep(100000);
Lck_Lock(&vwk->mtx);
}
- AZ(close(vwk->kq));
+ vwk->die = 1;
+ i = vwk->kq;
vwk->kq = -1;
+ AZ(close(i));
Lck_Unlock(&vwk->mtx);
AZ(pthread_join(vwk->thread, &vp));
Lck_Delete(&vwk->mtx);
More information about the varnish-commit
mailing list