summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzat Khuzhin <a3at.mail@gmail.com>2018-10-30 23:59:24 +0300
committerAzat Khuzhin <azat@libevent.org>2019-01-20 19:53:45 +0300
commitd148783103e8f1b916101eb89b04e2457f186f0a (patch)
tree5e2e5196b4c5985cfed7860418f59e2597e8965f
parent63306e6f41587894e037c56f0ef5de950f818834 (diff)
downloadlibevent-d148783103e8f1b916101eb89b04e2457f186f0a.tar.gz
Preserve ET bit for backends with changelist
[ Upstream commit a1293bd2e626cba1f687cd0e50a219f8661775fc ] Fixes: #636
-rw-r--r--evmap.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/evmap.c b/evmap.c
index 0b1a0b07..95f0e3cf 100644
--- a/evmap.c
+++ b/evmap.c
@@ -653,6 +653,7 @@ event_changelist_add(struct event_base *base, evutil_socket_t fd, short old, sho
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);
@@ -664,14 +665,10 @@ event_changelist_add(struct event_base *base, evutil_socket_t fd, short old, sho
* 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_READ|EV_SIGNAL))
+ change->read_change = evchange;
+ if (events & EV_WRITE)
+ change->write_change = evchange;
event_changelist_check(base);
return (0);
@@ -684,6 +681,7 @@ event_changelist_del(struct event_base *base, evutil_socket_t fd, short old, sho
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);
@@ -714,14 +712,14 @@ event_changelist_del(struct event_base *base, evutil_socket_t fd, short old, sho
(change->read_change & EV_CHANGE_ADD))
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 & EV_CHANGE_ADD))
change->write_change = 0;
else
- change->write_change = EV_CHANGE_DEL;
+ change->write_change = del;
}
event_changelist_check(base);