]> granicus.if.org Git - libevent/commitdiff
Epoll ET setting lost with multiple events for same fd
authorIsidor Kouvelas <kouvelas@arista.com>
Tue, 30 Oct 2018 15:50:08 +0000 (08:50 -0700)
committerAzat Khuzhin <a3at.mail@gmail.com>
Tue, 30 Oct 2018 22:21:07 +0000 (01:21 +0300)
After two or more events have been registered for the same file
descriptor using EV_ET, if one of the events is deleted, then the
epoll_ctl() call issued by libevent drops the EPOLLET flag resulting in
level triggered notifications.

[ azat: use existing "et" in the evmap_io_del_() ]

epoll.c
evmap.c

diff --git a/epoll.c b/epoll.c
index bf730b23db8fcaa560949d1e56f622eba5eeef09..a0df0d21bf8963957a639139617efdcf5e782be7 100644 (file)
--- a/epoll.c
+++ b/epoll.c
@@ -401,11 +401,14 @@ epoll_nochangelist_del(struct event_base *base, evutil_socket_t fd,
        ch.old_events = old;
        ch.read_change = ch.write_change = ch.close_change = 0;
        if (events & EV_WRITE)
-               ch.write_change = EV_CHANGE_DEL;
+               ch.write_change = EV_CHANGE_DEL |
+                   (events & EV_ET);
        if (events & EV_READ)
-               ch.read_change = EV_CHANGE_DEL;
+               ch.read_change = EV_CHANGE_DEL |
+                   (events & EV_ET);
        if (events & EV_CLOSED)
-               ch.close_change = EV_CHANGE_DEL;
+               ch.close_change = EV_CHANGE_DEL |
+                   (events & EV_ET);
 
        return epoll_apply_one_change(base, base->evbase, &ch);
 }
diff --git a/evmap.c b/evmap.c
index 3f76dd0ae1f7024613be86fc91c8c6e3d7af087f..1eb70696fa980421f028a7c2e629450e12588731 100644 (file)
--- a/evmap.c
+++ b/evmap.c
@@ -393,7 +393,8 @@ evmap_io_del_(struct event_base *base, evutil_socket_t fd, struct event *ev)
 
        if (res) {
                void *extra = ((char*)ctx) + sizeof(struct evmap_io);
-               if (evsel->del(base, ev->ev_fd, old, res, extra) == -1) {
+               if (evsel->del(base, ev->ev_fd,
+                       old, (ev->ev_events & EV_ET) | res, extra) == -1) {
                        retval = -1;
                } else {
                        retval = 1;