From: chris mikkelson Date: Fri, 27 Mar 2009 00:00:09 +0000 (-0500) Subject: Use explicit libevent bases. The implicit "current_base" X-Git-Url: https://git.mikk.net/?a=commitdiff_plain;h=ed42618e10a6b4a3379ac3b73cf7cb820707d531;p=smtpsink Use explicit libevent bases. The implicit "current_base" might cause breakage if a module also calls event_init(). --- diff --git a/conn_queue.c b/conn_queue.c index c2cbec6..f3e9d30 100644 --- a/conn_queue.c +++ b/conn_queue.c @@ -13,6 +13,7 @@ struct event_qstate { int fds[2]; struct event e; + struct event_base *base; }; struct tpool_qstate { @@ -91,6 +92,16 @@ conn_queue_set_tpool_size(struct conn_queue *cq, int start) return 1; } +int +conn_queue_set_evbase(struct conn_queue *cq, struct event_base *base) +{ + struct event_qstate *ep; + if (cq->type != Q_EVENT) return 0; + ep = (struct event_qstate *)cq->priv; + ep->base = base; + return 1; +} + static void event_enqueue(struct conn_queue *cq, struct conn *c) { @@ -130,6 +141,7 @@ event_run(struct conn_queue *cq) struct event_qstate *ep = (struct event_qstate *)cq->priv; event_set(&ep->e, ep->fds[0], EV_READ|EV_PERSIST, event_callback, (void *)cq); + if (ep->base) event_base_set(ep->base, &ep->e); event_add(&ep->e, 0); } diff --git a/conn_queue.h b/conn_queue.h index 4b25885..bbbdbb5 100644 --- a/conn_queue.h +++ b/conn_queue.h @@ -17,6 +17,7 @@ struct conn_queue { int conn_queue_init(struct conn_queue *, void (*)(struct conn *), int); int conn_queue_set_tpool_size(struct conn_queue *, int); +int conn_queue_set_evbase(struct conn_queue *, struct event_base *); /* To setup: diff --git a/io.c b/io.c index cbfa685..b6258dc 100644 --- a/io.c +++ b/io.c @@ -11,6 +11,7 @@ #include "smtpsink-int.h" struct conn_queue io_queue; +static struct event_base *io_base; static struct timeval timeout = {20, 0}; static void @@ -28,8 +29,9 @@ handle_ioreq(struct conn *c) void io_init(void) { - event_init(); + io_base = event_init(); conn_queue_init(&io_queue, handle_ioreq, Q_EVENT); + conn_queue_set_evbase(&io_queue, io_base); io_queue.run(&io_queue); } @@ -95,6 +97,14 @@ void io_initconn(struct conn *c) { event_set(&c->re, c->fd, EV_READ, read_cb, (void *)c); + event_base_set(io_base, &c->re); event_set(&c->we, c->fd, EV_WRITE, write_cb, (void *)c); + event_base_set(io_base, &c->we); +} + +void +io_dispatch(void) +{ + event_base_dispatch(io_base); } diff --git a/smtpsink-int.h b/smtpsink-int.h index fcc4529..5e87033 100644 --- a/smtpsink-int.h +++ b/smtpsink-int.h @@ -6,6 +6,7 @@ extern void new_listener(char *); extern void start_listeners(void); extern void io_init(void); +extern void io_dispatch(void); extern void io_initconn(struct conn *); extern int conn_queue_init(struct conn_queue *, void (*)(struct conn *), int); diff --git a/smtpsink.c b/smtpsink.c index 8311520..f479085 100644 --- a/smtpsink.c +++ b/smtpsink.c @@ -136,13 +136,12 @@ main(int argc, char **argv) signal(SIGPIPE,SIG_IGN); pthread_create(&sl, 0, sigloop, event_init()); - event_init(); conn_pool_init(concurrency); io_init(); smtp_init(tstart); start_listeners(); /* modules_init(); */ - event_dispatch(); + io_dispatch(); return 0; }