might cause breakage if a module also calls event_init().
struct event_qstate {
int fds[2];
struct event e;
+ struct event_base *base;
};
struct tpool_qstate {
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)
{
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);
}
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:
#include "smtpsink-int.h"
struct conn_queue io_queue;
+static struct event_base *io_base;
static struct timeval timeout = {20, 0};
static void
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);
}
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);
}
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);
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;
}