[master] 031bed0 Split Wait_HeapDelete() out from Wait_Call().

Poul-Henning Kamp phk at FreeBSD.org
Mon Jul 6 22:39:46 CEST 2015


commit 031bed01836063a784c46df5ba077a61669c0a35
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Jul 6 20:30:18 2015 +0000

    Split Wait_HeapDelete() out from Wait_Call().

diff --git a/bin/varnishd/waiter/cache_waiter.c b/bin/varnishd/waiter/cache_waiter.c
index 7d23da5..b1d0801 100644
--- a/bin/varnishd/waiter/cache_waiter.c
+++ b/bin/varnishd/waiter/cache_waiter.c
@@ -67,15 +67,13 @@ waited_update(void *priv, void *p, unsigned u)
 /**********************************************************************/
 
 void
-Wait_Call(const struct waiter *w,
-    struct waited *wp, enum wait_event ev, double now)
+Wait_Call(const struct waiter *w, struct waited *wp,
+    enum wait_event ev, double now)
 {
 	CHECK_OBJ_NOTNULL(w, WAITER_MAGIC);
 	CHECK_OBJ_NOTNULL(wp, WAITED_MAGIC);
 	CHECK_OBJ_NOTNULL(wp->waitfor, WAITFOR_MAGIC);
 	AN(wp->waitfor->func);
-	if (wp->idx != BINHEAP_NOIDX)
-		binheap_delete(w->heap, wp->idx);
 	assert(wp->idx == BINHEAP_NOIDX);
 	wp->waitfor->func(wp, ev, now);
 }
@@ -91,6 +89,23 @@ Wait_HeapInsert(const struct waiter *w, struct waited *wp)
 	binheap_insert(w->heap, wp);
 }
 
+/*
+ * XXX: wp is const because otherwise FlexeLint complains.  However, *wp
+ * XXX: will actually change as a result of calling this function, via
+ * XXX: the pointer stored in the bin-heap.  I can see how this const
+ * XXX: could maybe confuse a compilers optimizer, but I do not expect
+ * XXX: any harm to come from it.  Caveat Emptor.
+ */
+
+void
+Wait_HeapDelete(const struct waiter *w, const struct waited *wp)
+{
+	CHECK_OBJ_NOTNULL(w, WAITER_MAGIC);
+	CHECK_OBJ_NOTNULL(wp, WAITED_MAGIC);
+	if (wp->idx != BINHEAP_NOIDX)
+		binheap_delete(w->heap, wp->idx);
+}
+
 double
 Wait_HeapDue(const struct waiter *w, struct waited **wpp)
 {
diff --git a/bin/varnishd/waiter/cache_waiter_epoll.c b/bin/varnishd/waiter/cache_waiter_epoll.c
index 47b036f..9eeec23 100644
--- a/bin/varnishd/waiter/cache_waiter_epoll.c
+++ b/bin/varnishd/waiter/cache_waiter_epoll.c
@@ -102,6 +102,7 @@ vwe_thread(void *priv)
 			CHECK_OBJ_NOTNULL(wp, WAITED_MAGIC);
 			AZ(epoll_ctl(vwe->epfd, EPOLL_CTL_DEL, wp->fd, NULL));
 			vwe->nwaited--;
+			Wait_HeapDelete(w, wp);
 			Wait_Call(w, wp, WAITER_TIMEOUT, now);
 		}
 		then = vwe->next - now;
@@ -119,6 +120,7 @@ vwe_thread(void *priv)
 				continue;
 			}
 			CAST_OBJ_NOTNULL(wp, ep->data.ptr, WAITED_MAGIC);
+			Wait_HeapDelete(w, wp);
 			AZ(epoll_ctl(vwe->epfd, EPOLL_CTL_DEL, wp->fd, NULL));
 			vwe->nwaited--;
 			if (ep->events & EPOLLIN)
diff --git a/bin/varnishd/waiter/cache_waiter_kqueue.c b/bin/varnishd/waiter/cache_waiter_kqueue.c
index baeed5c..63bf794 100644
--- a/bin/varnishd/waiter/cache_waiter_kqueue.c
+++ b/bin/varnishd/waiter/cache_waiter_kqueue.c
@@ -97,6 +97,7 @@ vwk_thread(void *priv)
 			CHECK_OBJ_NOTNULL(wp, WAITED_MAGIC);
 			EV_SET(ke, wp->fd, EVFILT_READ, EV_DELETE, 0, 0, NULL);
 			AZ(kevent(vwk->kq, ke, 1, NULL, 0, NULL));
+			Wait_HeapDelete(w, wp);
 			Wait_Call(w, wp, WAITER_TIMEOUT, now);
 		}
 		then = vwk->next - now;
@@ -115,6 +116,7 @@ vwk_thread(void *priv)
 				continue;
 			}
 			CAST_OBJ_NOTNULL(wp, ke[j].udata, WAITED_MAGIC);
+			Wait_HeapDelete(w, wp);
 			vwk->nwaited--;
 			if (kp->flags & EV_EOF)
 				Wait_Call(w, wp, WAITER_REMCLOSE, now);
diff --git a/bin/varnishd/waiter/cache_waiter_poll.c b/bin/varnishd/waiter/cache_waiter_poll.c
index 471d9e7..72c97fb 100644
--- a/bin/varnishd/waiter/cache_waiter_poll.c
+++ b/bin/varnishd/waiter/cache_waiter_poll.c
@@ -156,15 +156,17 @@ vwp_main(void *priv)
 {
 	int v;
 	struct vwp *vwp;
+	struct waiter *w;
 	struct waited *wp;
 	double now, then;
 	int i;
 
 	THR_SetName("cache-poll");
 	CAST_OBJ_NOTNULL(vwp, priv, VWP_MAGIC);
+	w = vwp->waiter;
 
 	while (1) {
-		then = Wait_HeapDue(vwp->waiter, &wp);
+		then = Wait_HeapDue(w, &wp);
 		if (wp == NULL)
 			i = -1;
 		else
@@ -179,18 +181,20 @@ vwp_main(void *priv)
 			wp = vwp->idx[i];
 			CHECK_OBJ_NOTNULL(wp, WAITED_MAGIC);
 
-			if (v == 0 && Wait_HeapDue(vwp->waiter, NULL) > now)
+			if (v == 0 && Wait_HeapDue(w, NULL) > now)
 				break;
 			if (vwp->pollfd[i].revents)
 				v--;
 			then = Wait_When(wp);
 			if (then <= now) {
-				Wait_Call(vwp->waiter, wp, WAITER_TIMEOUT, now);
+				Wait_HeapDelete(w, wp);
+				Wait_Call(w, wp, WAITER_TIMEOUT, now);
 				vwp_del(vwp, i);
 			} else if (vwp->pollfd[i].revents & POLLIN) {
 				assert(wp->fd > 0);
 				assert(wp->fd == vwp->pollfd[i].fd);
-				Wait_Call(vwp->waiter, wp, WAITER_ACTION, now);
+				Wait_HeapDelete(w, wp);
+				Wait_Call(w, wp, WAITER_ACTION, now);
 				vwp_del(vwp, i);
 			} else {
 				i++;
diff --git a/bin/varnishd/waiter/cache_waiter_ports.c b/bin/varnishd/waiter/cache_waiter_ports.c
index b12cea3..0a647ef 100644
--- a/bin/varnishd/waiter/cache_waiter_ports.c
+++ b/bin/varnishd/waiter/cache_waiter_ports.c
@@ -126,6 +126,7 @@ vws_port_ev(struct vws *vws, struct waiter *w, port_event_t *ev, double now) {
 		 *          threadID=129476&tstart=0
 		 */
 		vws_del(vws, wp->fd);
+		Wait_HeapDelete(w, wp);
 		Wait_Call(w, wp, ev->portev_events & POLLERR ?
 		    WAITER_REMCLOSE : WAITER_ACTION,
 		    now);
diff --git a/bin/varnishd/waiter/waiter_priv.h b/bin/varnishd/waiter/waiter_priv.h
index f4e5261..c7d1d25 100644
--- a/bin/varnishd/waiter/waiter_priv.h
+++ b/bin/varnishd/waiter/waiter_priv.h
@@ -78,4 +78,5 @@ Wait_When(const struct waited *wp)
 void Wait_Call(const struct waiter *, struct waited *,
     enum wait_event ev, double now);
 void Wait_HeapInsert(const struct waiter *, struct waited *);
+void Wait_HeapDelete(const struct waiter *, const struct waited *);
 double Wait_HeapDue(const struct waiter *, struct waited **);



More information about the varnish-commit mailing list