r2722 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Tue Jun 17 11:37:45 CEST 2008


Author: phk
Date: 2008-06-17 11:37:44 +0200 (Tue, 17 Jun 2008)
New Revision: 2722

Modified:
   trunk/varnish-cache/bin/varnishd/mgt_event.c
Log:
Fix broken logic in the poll-fd compaction function, which resulted in
a panic during this sequence:

	varnishd -d -d -T :8082
	ctrl-D
	telnet localhost 8082 (from other terminal)



Modified: trunk/varnish-cache/bin/varnishd/mgt_event.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_event.c	2008-06-17 09:21:58 UTC (rev 2721)
+++ trunk/varnish-cache/bin/varnishd/mgt_event.c	2008-06-17 09:37:44 UTC (rev 2722)
@@ -373,23 +373,26 @@
 	unsigned u;
 	struct pollfd *p;
 	struct ev *ep;
+	int lfd;
 
+	DBG(evb, "compact_pfd() lpfd = %d\n", evb->lpfd);
 	p = evb->pfd;
-	ep = VTAILQ_FIRST(&evb->events);
 	for (u = 0; u < evb->lpfd; u++, p++) {
+		DBG(evb, "...[%d] fd = %d\n", u, p->fd);
 		if (p->fd >= 0)
 			continue;
-		for(; ep != NULL; ep = VTAILQ_NEXT(ep, __list)) {
-			if (ep->fd >= 0 && ep->__poll_idx > u)
+		lfd = evb->pfd[evb->lpfd - 1].fd;
+		VTAILQ_FOREACH(ep, &evb->events, __list)
+			if (ep->fd == lfd)
 				break;
-		}
-		if (ep == NULL)
-			break;
-		*p = evb->pfd[ep->__poll_idx];
+		AN(ep);
+		DBG(evb, "...[%d] move %p pidx %d\n", u, ep, ep->__poll_idx);
+		*p = evb->pfd[--evb->lpfd];
 		ep->__poll_idx = u;
 	}
 	evb->lpfd = u;
 	evb->compact_pfd = 0;
+	DBG(evb, "... lpfd = %d\n", evb->lpfd);
 }
 
 /*--------------------------------------------------------------------*/




More information about the varnish-commit mailing list