o introduce evbuffer_reserve_space() and evbuffer_commit_space() to make processing in filters more efficient.
o reduce system calls for getting current time by caching it.
o separate signal events from io events; making the code less complex.
+ o support for periodic timeouts
Changes in 1.4.0:
o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr.
static void timeout_correct(struct event_base *, struct timeval *);
static void event_signal_closure(struct event_base *, struct event *ev);
+static void event_periodic_closure(struct event_base *, struct event *ev);
static void
detect_monotonic(void)
return (base->event_count > 0);
}
+static void
+event_periodic_closure(struct event_base *base, struct event *ev)
+{
+ event_add(ev, &ev->_ev.ev_periodic.tv_interval);
+ (*ev->ev_callback)((int)ev->ev_fd, ev->ev_res, ev->ev_arg);
+}
+
static void
event_signal_closure(struct event_base *base, struct event *ev)
{
return (0);
}
+void
+evperiodic_assign(struct event *ev, struct event_base *base,
+ struct timeval *tv, void (*cb)(evutil_socket_t, short, void *), void *arg)
+{
+ event_assign(ev, base, -1, EV_TIMEOUT, cb, arg);
+
+ ev->_ev.ev_periodic.tv_interval = *tv;
+ ev->ev_closure = event_periodic_closure;
+}
+
struct event *
event_new(struct event_base *base, evutil_socket_t fd, short events, void (*cb)(evutil_socket_t, short, void *), void *arg)
{
*/
int event_base_loopbreak(struct event_base *);
+/**
+ Define a periodic timer.
+
+ Behaves like a timer only that it repeats at the specified interval.
+ To start this time, it needs to be added via event_add().
+
+ @param ev event struct to be modified
+ @param base the event base to which this event belongs
+ @param tv periodicity interval
+ @param cb callback function
+ @param arg argument that will be passed to the callback function
+*/
+
+void evperiodic_assign(struct event *ev, struct event_base *base,
+ struct timeval *tv, void (*cb)(int, short, void *), void *arg);
+
/**
Define a timer event.
/* Allows deletes in callback */
short *ev_pncalls;
} ev_signal;
+
+ struct {
+ struct timeval tv_interval;
+ } ev_periodic;
} _ev;
short ev_events;
cleanup_test();
}
+static void
+periodic_timeout_cb(int fd, short event, void *arg)
+{
+ int *count = arg;
+
+ (*count)++;
+ if (*count > 5) {
+ test_ok = 1;
+ event_base_loopexit(global_base, NULL);
+ }
+}
+
+static void
+test_periodictimeout(void)
+{
+ struct timeval tv, tv_interval;
+ struct event ev;
+ int count = 0;
+
+ setup_test("Periodic timeout: ");
+
+ timerclear(&tv_interval);
+ tv_interval.tv_usec = 10000;
+
+ tv.tv_usec = 0;
+ tv.tv_sec = 0;
+ evperiodic_assign(&ev, global_base, &tv_interval,
+ periodic_timeout_cb, &count);
+ event_add(&ev, &tv);
+
+ event_dispatch();
+
+ event_del(&ev);
+
+ cleanup_test();
+}
+
#ifndef WIN32
extern struct event_base *current_base;
static void
test_evutil_strtoll();
+ test_periodictimeout();
+
/* use the global event base and need to be called first */
test_priorities(1);
test_priorities(2);
test_combined();
test_simpletimeout();
+
#ifndef WIN32
test_simplesignal();
test_immediatesignal();