o Move the EVBUFFER_INPUT and EVBUFFER_OUTPUT macros to bufferevent_compat.h
o Add a bufferevent_getfd() function to mirror bufferevent_setfd()
o Make bufferevent_setfd() return an error code if the operation is not successful.
+ o Shave 22 bytes off struct event on 32-bit platforms by shrinking and re-ordering fields. The savings on 64-bit platforms is likely higher.
+ o Cap the maximum number of priorities at 256.
Changes in 2.0.1-alpha:
o free minheap on event_base_free(); from Christopher Layne
#define ev_ncalls _ev.ev_signal.ev_ncalls
#define ev_pncalls _ev.ev_signal.ev_pncalls
+/* Possible event closures. */
+#define EV_CLOSURE_NONE 0
+#define EV_CLOSURE_SIGNAL 1
+#define EV_CLOSURE_PERSIST 2
+
/** Structure to define the backend of a given event_base. */
struct eventop {
/** The name of this backend. */
{
int i;
- if (base->event_count_active || npriorities < 1)
+ if (base->event_count_active || npriorities < 1
+ || npriorities >= EVENT_MAX_PRIORITIES)
return (-1);
if (npriorities == base->nactivequeues)
EVBASE_RELEASE_LOCK(base,
EVTHREAD_WRITE, th_base_lock);
- if (ev->ev_closure != NULL)
- (*ev->ev_closure)(base, ev);
- else
+ switch (ev->ev_closure) {
+ case EV_CLOSURE_SIGNAL:
+ event_signal_closure(base, ev);
+ break;
+ case EV_CLOSURE_PERSIST:
+ event_persist_closure(base, ev);
+ break;
+ default:
+ case EV_CLOSURE_NONE:
(*ev->ev_callback)(
(int)ev->ev_fd, ev->ev_res, ev->ev_arg);
+ break;
+ }
+
if (base->event_break)
return -1;
EVBASE_ACQUIRE_LOCK(base, EVTHREAD_WRITE, th_base_lock);
if ((events & (EV_READ|EV_WRITE)) != 0)
event_errx(1, "%s: EV_SIGNAL incompatible use",
__func__);
- ev->ev_closure = event_signal_closure;
+ ev->ev_closure = EV_CLOSURE_SIGNAL;
} else {
if (events & EV_PERSIST) {
timerclear(&ev->ev_io_timeout);
- ev->ev_closure = event_persist_closure;
+ ev->ev_closure = EV_CLOSURE_PERSIST;
} else {
- ev->ev_closure = NULL;
+ ev->ev_closure = EV_CLOSURE_NONE;
}
}
* for persistent timeout events, we remember the
* timeout value and re-add the event.
*/
- if (ev->ev_closure == event_persist_closure)
+ if (ev->ev_closure == EV_CLOSURE_PERSIST)
ev->ev_io_timeout = *tv;
/*
TAILQ_ENTRY (event) (ev_active_next);
TAILQ_ENTRY (event) (ev_next);
int min_heap_idx; /* for managing timeouts */
+ evutil_socket_t ev_fd;
struct event_base *ev_base;
- evutil_socket_t ev_fd;
union {
/* used for io events */
struct {
} _ev;
short ev_events;
-
+ short ev_res; /* result passed to event callback */
+ short ev_flags;
+ ev_uint8_t ev_pri; /* smaller numbers are higher priority */
+ ev_uint8_t ev_closure;
struct timeval ev_timeout;
- int ev_pri; /* smaller numbers are higher priority */
-
/* allows us to adopt for different types of events */
- void (*ev_closure)(struct event_base *, struct event *);
void (*ev_callback)(evutil_socket_t, short, void *arg);
void *ev_arg;
-
- int ev_res; /* result passed to event callback */
- int ev_flags;
};
#ifdef EVENT_FD