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