r650 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Sat Aug 5 13:08:26 CEST 2006


Author: phk
Date: 2006-08-05 13:08:26 +0200 (Sat, 05 Aug 2006)
New Revision: 650

Modified:
   trunk/varnish-cache/bin/varnishd/mgt_event.c
Log:
More bugfixes


Modified: trunk/varnish-cache/bin/varnishd/mgt_event.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_event.c	2006-08-05 11:07:49 UTC (rev 649)
+++ trunk/varnish-cache/bin/varnishd/mgt_event.c	2006-08-05 11:08:26 UTC (rev 650)
@@ -226,16 +226,18 @@
 	} else
 		e->__poll_idx = -1;
 
+	e->magic = EV_MAGIC;	/* before binheap_insert() */
+
 	if (e->timeout != 0.0) {
 		e->__when += ev_now() + e->timeout;
 		binheap_insert(evb->binheap, e);
+		assert(e->__binheap_idx > 0);
 	} else {
 		e->__when = 0.0;
+		e->__binheap_idx = 0;
 	}
 
-	e->magic = EV_MAGIC;
 	e->__evb = evb;
-	e->__binheap_idx = 0;
 	e->__privflags = 0;
 	if (e->fd < 0)
 		TAILQ_INSERT_TAIL(&evb->events, e, __list);
@@ -316,11 +318,12 @@
 
 /*--------------------------------------------------------------------*/
 
-static void
+static int
 ev_sched_timeout(struct evbase *evb, struct ev *e, double t)
 {
 	int i;
 
+
 printf("Call %p %s (TMO)\n", e, e->name);
 	i = e->callback(e, 0);
 printf("Back %p %s (TMO)\n", e, e->name);
@@ -328,13 +331,14 @@
 		ev_del(evb, e);
 		free(e);
 	} else {
-		e->__when += t + e->timeout;
-		binheap_delete(evb->binheap, 0);
+		e->__when = t + e->timeout;
+		binheap_delete(evb->binheap, e->__binheap_idx);
 		binheap_insert(evb->binheap, e);
 	}
+	return (1);
 }
 
-static void
+static int
 ev_sched_signal(struct evbase *evb)
 {
 	int i, j;
@@ -357,6 +361,7 @@
 			free(e);
 		}
 	}
+	return (1);
 }
 
 int
@@ -370,13 +375,14 @@
 	CHECK_OBJ_NOTNULL(evb, EVBASE_MAGIC);
 	e = binheap_root(evb->binheap);
 	if (e != NULL) {
+		assert(e->__binheap_idx == 1);
 		CHECK_OBJ_NOTNULL(e, EV_MAGIC);
 		t = ev_now();
-		if (e->__when <= t) {
-			ev_sched_timeout(evb, e, t);
-			return (1);
-		}
+		if (e->__when <= t)
+			return (ev_sched_timeout(evb, e, t));
 		tmo = (e->__when - t) * 1e3;
+		if (tmo == 0)
+			tmo = 1;
 	} else
 		tmo = INFTIM;
 
@@ -386,23 +392,16 @@
 	if (tmo == INFTIM && evb->lpfd == 0)
 		return (0);
 
-	if (evb->psig) {
-printf("hassig\n");
-		ev_sched_signal(evb);
-		return (1);
-	}
+	if (evb->psig)
+		return (ev_sched_signal(evb));
 	i = poll(evb->pfd, evb->lpfd, tmo);
-	if(i == -1 && errno == EINTR) {
-printf("gotsig\n");
-		ev_sched_signal(evb);
-		return (1);
-	}
+	if(i == -1 && errno == EINTR)
+		return (ev_sched_signal(evb));
 	if (i == 0) {
 		assert(e != NULL);
 		t = ev_now();
 		if (e->__when <= t)
-			ev_sched_timeout(evb, e, t);
-		return (1);
+			return (ev_sched_timeout(evb, e, t));
 	}
 	evb->disturbed = 0;
 	TAILQ_FOREACH_SAFE(e, &evb->events, __list, e2) {




More information about the varnish-commit mailing list