r648 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Sat Aug 5 12:31:30 CEST 2006


Author: phk
Date: 2006-08-05 12:31:30 +0200 (Sat, 05 Aug 2006)
New Revision: 648

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


Modified: trunk/varnish-cache/bin/varnishd/mgt_event.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_event.c	2006-08-05 09:27:57 UTC (rev 647)
+++ trunk/varnish-cache/bin/varnishd/mgt_event.c	2006-08-05 10:31:30 UTC (rev 648)
@@ -35,6 +35,7 @@
 	struct binheap		*binheap;
 	unsigned char		compact_pfd;
 	unsigned char		disturbed;
+	unsigned		psig;
 };
 
 /*--------------------------------------------------------------------*/
@@ -114,7 +115,7 @@
 	if (os == NULL)
 		return (ENOMEM);
 
-	memcpy(os, ev_sigs, ev_nsig);
+	memcpy(os, ev_sigs, ev_nsig * sizeof *os);
 
 	free(ev_sigs);
 	ev_sigs = os;
@@ -128,9 +129,15 @@
 static void
 ev_sighandler(int sig)
 {
+	struct evsig *es;
+
 	assert(sig < ev_nsig);
 	assert(ev_sigs != NULL);
-	ev_sigs[sig].happened = 1;
+	es = &ev_sigs[sig];
+	if (!es->happened)
+		es->evb->psig++;
+	es->happened = 1;
+printf("SIG %d happened\n", sig);
 }
 
 /*--------------------------------------------------------------------*/
@@ -163,7 +170,20 @@
 	free(evb);
 }
 
+/*--------------------------------------------------------------------*/
 
+struct ev *
+ev_new(void)
+{
+	struct ev *e;
+
+	e = calloc(sizeof *e, 1);
+	if (e != NULL) {
+		e->fd = -1;
+	}
+	return (e);
+}
+
 /*--------------------------------------------------------------------*/
 
 int
@@ -174,25 +194,27 @@
 	CHECK_OBJ_NOTNULL(evb, EVBASE_MAGIC);
 	assert(e->magic != EV_MAGIC);
 	assert(e->callback != NULL);
-	assert(e->signal >= 0);
+	assert(e->sig >= 0);
 	assert(e->timeout >= 0.0);
+	assert(e->fd < 0 || e->fd_flags);
 
-	if (e->signal > 0 && ev_get_sig(e->signal))
+	if (e->sig > 0 && ev_get_sig(e->sig))
 		return (ENOMEM);
 
 	if (e->fd >= 0 && ev_get_pfd(evb))
 		return (ENOMEM);
 
-	if (e->signal > 0) {
-		es = &ev_sigs[e->signal];
+	if (e->sig > 0) {
+		es = &ev_sigs[e->sig];
 		if (es->ev != NULL)
 			return (EBUSY);
 		assert(es->happened == 0);
 		es->ev = e;
+		es->evb = evb;
 		es->sigact.sa_flags = e->sig_flags;
 		es->sigact.sa_handler = ev_sighandler;
-		assert(sigaction(e->signal, &es->sigact, NULL) == 0);
-		es->evb = evb;
+	} else {
+		es = NULL;
 	}
 
 	if (e->fd >= 0) {
@@ -220,6 +242,11 @@
 	else
 		TAILQ_INSERT_HEAD(&evb->events, e, __list);
 
+	if (e->sig > 0) {
+		assert(es != NULL);
+		assert(sigaction(e->sig, &es->sigact, NULL) == 0);
+	}
+
 	return (0);
 }
 
@@ -244,15 +271,15 @@
 		e->fd = -1;
 	}
 
-	if (e->signal > 0) {
-		assert(e->signal < ev_nsig);
-		es = &ev_sigs[e->signal];
+	if (e->sig > 0) {
+		assert(e->sig < ev_nsig);
+		es = &ev_sigs[e->sig];
 		assert(es->ev == e);
 		es->ev = NULL;
 		es->evb = NULL;
 		es->sigact.sa_flags = e->sig_flags;
 		es->sigact.sa_handler = SIG_DFL;
-		assert(sigaction(e->signal, &es->sigact, NULL) == 0);
+		assert(sigaction(e->sig, &es->sigact, NULL) == 0);
 		es->happened = 0;
 	}
 
@@ -307,11 +334,36 @@
 	}
 }
 
+static void
+ev_sched_signal(struct evbase *evb)
+{
+	int i, j;
+	struct evsig *es;
+	struct ev *e;
+
+	es = ev_sigs;
+	for (j = 0; j < ev_nsig; j++, es++) {
+		if (!es->happened || es->evb != evb)
+			continue;
+		evb->psig--;
+		es->happened = 0;
+		e = es->ev;
+		assert(e != NULL);
+printf("Call %p %s (sig %d)\n", e, e->name, j);
+		i = e->callback(e, EV_SIG);
+printf("Back %p %s (sig %d)\n", e, e->name, j);
+		if (i) {
+			ev_del(evb, e);
+			free(e);
+		}
+	}
+}
+
 int
 ev_schedule_one(struct evbase *evb)
 {
 	double t;
-	struct ev *e, *e2;
+	struct ev *e, *e2, *e3;
 	int i, j, tmo;
 	struct pollfd *pfd;
 
@@ -333,22 +385,16 @@
 
 	if (tmo == INFTIM && evb->lpfd == 0)
 		return (0);
+
+	if (evb->psig) {
+printf("hassig\n");
+		ev_sched_signal(evb);
+		return (1);
+	}
 	i = poll(evb->pfd, evb->lpfd, tmo);
 	if(i == -1 && errno == EINTR) {
-		for (j = 0; j < ev_nsig; j++) {
-			if (!ev_sigs[j].happened || ev_sigs[j].evb != evb)
-				continue;
-			ev_sigs[j].happened = 0;
-			e = ev_sigs[j].ev;
-			assert(e != NULL);
-printf("Call %p %s (sig %d)\n", e, e->name, j);
-			i = e->callback(e, EV_SIG);
-printf("Back %p %s (sig %d)\n", e, e->name, j);
-			if (i) {
-				ev_del(evb, e);
-				free(e);
-			}
-		}
+printf("gotsig\n");
+		ev_sched_signal(evb);
 		return (1);
 	}
 	if (i == 0) {
@@ -375,11 +421,14 @@
 printf("Back %p %s (%u)\n", e, e->name, pfd->revents);
 		i--;
 		if (evb->disturbed) {
-			TAILQ_FOREACH(e2, &evb->events, __list)
-				if (e2 == e)
+			TAILQ_FOREACH(e3, &evb->events, __list) {
+				if (e3 == e) {
+					e3 = TAILQ_NEXT(e, __list);
 					break;
-			assert(e2 == e);
-			e2 = TAILQ_NEXT(e, __list);
+				} else if (e3 == e2)
+					break;
+			}
+			e2 = e3;
 			evb->disturbed = 0;
 		}
 		if (j) {

Modified: trunk/varnish-cache/bin/varnishd/mgt_event.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_event.h	2006-08-05 09:27:57 UTC (rev 647)
+++ trunk/varnish-cache/bin/varnishd/mgt_event.h	2006-08-05 10:31:30 UTC (rev 648)
@@ -5,7 +5,7 @@
 struct ev;
 struct evbase;
 
-typedef int ev_cb_f(struct ev *, unsigned what);
+typedef int ev_cb_f(struct ev *, int what);
 
 struct ev {
 	unsigned	magic;
@@ -20,7 +20,7 @@
 #define		EV_ERR	POLLERR
 #define		EV_HUP	POLLHUP
 #define		EV_SIG	-1
-	int		signal;
+	int		sig;
 	unsigned	sig_flags;
 	double		timeout;
 	ev_cb_f		*callback;
@@ -39,6 +39,9 @@
 
 struct evbase *ev_new_base(void);
 void ev_destroy_base(struct evbase *evb);
+
+struct ev *ev_new(void);
+
 int ev_add(struct evbase *evb, struct ev *e);
 void ev_del(struct evbase *evb, struct ev *e);
 




More information about the varnish-commit mailing list