]> granicus.if.org Git - libevent/commitdiff
Preserve ET bit for backends with changelist
authorAzat Khuzhin <a3at.mail@gmail.com>
Tue, 30 Oct 2018 20:59:24 +0000 (23:59 +0300)
committerAzat Khuzhin <a3at.mail@gmail.com>
Tue, 30 Oct 2018 22:21:07 +0000 (01:21 +0300)
evmap.c

diff --git a/evmap.c b/evmap.c
index 1eb70696fa980421f028a7c2e629450e12588731..31ab4feee8cca406529e15fa2273b97d8229dd40 100644 (file)
--- a/evmap.c
+++ b/evmap.c
@@ -859,6 +859,7 @@ event_changelist_add_(struct event_base *base, evutil_socket_t fd, short old, sh
        struct event_changelist *changelist = &base->changelist;
        struct event_changelist_fdinfo *fdinfo = p;
        struct event_change *change;
+       short evchange = EV_CHANGE_ADD | (events & (EV_ET|EV_PERSIST|EV_SIGNAL));
 
        event_changelist_check(base);
 
@@ -870,18 +871,12 @@ event_changelist_add_(struct event_base *base, evutil_socket_t fd, short old, sh
         * since the delete might fail (because the fd had been closed since
         * the last add, for instance. */
 
-       if (events & (EV_READ|EV_SIGNAL)) {
-               change->read_change = EV_CHANGE_ADD |
-                   (events & (EV_ET|EV_PERSIST|EV_SIGNAL));
-       }
-       if (events & EV_WRITE) {
-               change->write_change = EV_CHANGE_ADD |
-                   (events & (EV_ET|EV_PERSIST|EV_SIGNAL));
-       }
-       if (events & EV_CLOSED) {
-               change->close_change = EV_CHANGE_ADD |
-                   (events & (EV_ET|EV_PERSIST|EV_SIGNAL));
-       }
+       if (events & (EV_READ|EV_SIGNAL))
+               change->read_change = evchange;
+       if (events & EV_WRITE)
+               change->write_change = evchange;
+       if (events & EV_CLOSED)
+               change->close_change = evchange;
 
        event_changelist_check(base);
        return (0);
@@ -894,6 +889,7 @@ event_changelist_del_(struct event_base *base, evutil_socket_t fd, short old, sh
        struct event_changelist *changelist = &base->changelist;
        struct event_changelist_fdinfo *fdinfo = p;
        struct event_change *change;
+       short del = EV_CHANGE_DEL | (events & EV_ET);
 
        event_changelist_check(base);
        change = event_changelist_get_or_construct(changelist, fd, old, fdinfo);
@@ -920,19 +916,19 @@ event_changelist_del_(struct event_base *base, evutil_socket_t fd, short old, sh
                if (!(change->old_events & (EV_READ | EV_SIGNAL)))
                        change->read_change = 0;
                else
-                       change->read_change = EV_CHANGE_DEL;
+                       change->read_change = del;
        }
        if (events & EV_WRITE) {
                if (!(change->old_events & EV_WRITE))
                        change->write_change = 0;
                else
-                       change->write_change = EV_CHANGE_DEL;
+                       change->write_change = del;
        }
        if (events & EV_CLOSED) {
                if (!(change->old_events & EV_CLOSED))
                        change->close_change = 0;
                else
-                       change->close_change = EV_CHANGE_DEL;
+                       change->close_change = del;
        }
 
        event_changelist_check(base);