o Fix use of freed memory in event_reinit; pointed out by Peter Postma
o constify struct timeval * where possible
o make event_get_supported_methods obey environment variables
+ o support for edge-triggered events on epoll and kqueue backends: patch from Valery Kholodkov
+
-
Changes in 1.4.0:
o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr.
o demote most http warnings to debug messages
continue;
if (evread != NULL)
- event_active(evread, EV_READ, 1);
+ event_active(evread, EV_READ | (evread->ev_events & EV_ET), 1);
if (evwrite != NULL)
- event_active(evwrite, EV_WRITE, 1);
+ event_active(evwrite, EV_WRITE | (evwrite->ev_events & EV_ET), 1);
}
return (0);
events |= EPOLLIN;
if (ev->ev_events & EV_WRITE)
events |= EPOLLOUT;
+ if(ev->ev_events & EV_ET)
+ events |= EPOLLET;
epev.data.ptr = evep;
epev.events = events;
const struct timeval *tv, void (*cb)(int, short, void *), void *arg);
/* Flags to pass to event_set(), event_new(), event_assign(),
- * event_pending()... */
+ * event_pending(), and anything else with an argument of the form
+ * "short events" */
#define EV_TIMEOUT 0x01
#define EV_READ 0x02
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08
-#define EV_PERSIST 0x10 /* Persistant event */
+/** Persistent event: won't get removed automatically when activated. */
+#define EV_PERSIST 0x10
+/** Select edge-triggered behavior, if supported by the backend. */
+#define EV_ET 0x20
/**
Define a timer event.
EV_READ, or EV_WRITE. The additional flag EV_PERSIST makes an event_add()
persistent until event_del() has been called.
+ For read and write events, edge-triggered behavior can be requested
+ with the EV_ET flag. Not all backends support edge-triggered
+ behavior. When an edge-triggered event is activated, the EV_ET flag
+ is added to its events argument.
+
@param ev an event struct to be modified
@param fd the file descriptor to be monitored
@param event desired events to monitor; can be EV_READ and/or EV_WRITE
if (!(ev->ev_events & EV_PERSIST))
ev->ev_flags &= ~EVLIST_X_KQINKERNEL;
- event_active(ev, which,
+ event_active(ev, which | (ev->ev_events & EV_ET),
ev->ev_events & EV_SIGNAL ? events[i].data : 1);
}
kev.flags = EV_ADD;
if (!(ev->ev_events & EV_PERSIST))
kev.flags |= EV_ONESHOT;
+ if (ev->ev_events & EV_ET)
+ kev.flags |= EV_CLEAR;
kev.udata = PTR_TO_UDATA(ev);
if (kq_insert(kqop, &kev) == -1)
kev.flags = EV_ADD;
if (!(ev->ev_events & EV_PERSIST))
kev.flags |= EV_ONESHOT;
+ if (ev->ev_events & EV_ET)
+ kev.flags |= EV_CLEAR;
kev.udata = PTR_TO_UDATA(ev);
if (kq_insert(kqop, &kev) == -1)
test_time_SOURCES = test-time.c
test_time_LDADD = ../libevent_core.la
regress_SOURCES = regress.c regress.h regress_http.c regress_dns.c \
- regress_rpc.c regress.gen.c regress.gen.h
+ regress_rpc.c regress.gen.c regress.gen.h regress_et.c
if PTHREAD_REGRESS
regress_SOURCES += regress_pthread.c
endif
test_evbuffer_iterative();
test_evbuffer_readln();
test_evbuffer_find();
-
+
test_bufferevent();
test_bufferevent_watermarks();
test_bufferevent_filters();
#if defined(HAVE_LIBZ)
regress_zlib();
#endif
-
+
http_suite();
rpc_suite();
test_simpletimeout();
+ test_edgetriggered();
+
#ifndef WIN32
test_simplesignal();
test_immediatesignal();
void dns_suite(void);
void regress_pthread(void);
-void regress_zlib(void);
+void regress_zlib(void);
+
+void test_edgetriggered(void);
#ifdef __cplusplus
}