mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-09 20:41:27 -04:00
Use current event set rather than current pending change when deciding whether to no-op a del
This alters event_changelist_del to quash deletion of events that didn't exist in the first place. As far as I can see, the add,delete, dispatch case described in the original comment will never happen. The recorded change is a single operation, not a queue. This seems to leave actions to delete events that never existed as the real targets for no-oping
This commit is contained in:
parent
2570ae50d3
commit
04ba27ebf2
19
evmap.c
19
evmap.c
@ -685,14 +685,11 @@ event_changelist_del(struct event_base *base, evutil_socket_t fd, short old, sho
|
|||||||
if (!change)
|
if (!change)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* A delete removes any previous add, rather than replacing it:
|
/* A delete on an event set that doesn't contain the event to be
|
||||||
on those platforms where "add, delete, dispatch" is not the same
|
deleted produces a no-op. This effectively emoves any previous
|
||||||
as "no-op, dispatch", we want the no-op behavior.
|
uncommitted add, rather than replacing it: on those platforms where
|
||||||
|
"add, delete, dispatch" is not the same as "no-op, dispatch", we
|
||||||
As well as checking the current operation we should also check
|
want the no-op behavior.
|
||||||
the original set of events to make sure were not ignoring
|
|
||||||
the case where the add operation is present on an event that
|
|
||||||
was already set.
|
|
||||||
|
|
||||||
If we have a no-op item, we could remove it it from the list
|
If we have a no-op item, we could remove it it from the list
|
||||||
entirely, but really there's not much point: skipping the no-op
|
entirely, but really there's not much point: skipping the no-op
|
||||||
@ -704,15 +701,13 @@ event_changelist_del(struct event_base *base, evutil_socket_t fd, short old, sho
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (events & (EV_READ|EV_SIGNAL)) {
|
if (events & (EV_READ|EV_SIGNAL)) {
|
||||||
if (!(change->old_events & (EV_READ | EV_SIGNAL)) &&
|
if (!(change->old_events & (EV_READ | EV_SIGNAL)))
|
||||||
(change->read_change & EV_CHANGE_ADD))
|
|
||||||
change->read_change = 0;
|
change->read_change = 0;
|
||||||
else
|
else
|
||||||
change->read_change = EV_CHANGE_DEL;
|
change->read_change = EV_CHANGE_DEL;
|
||||||
}
|
}
|
||||||
if (events & EV_WRITE) {
|
if (events & EV_WRITE) {
|
||||||
if (!(change->old_events & EV_WRITE) &&
|
if (!(change->old_events & EV_WRITE))
|
||||||
(change->write_change & EV_CHANGE_ADD))
|
|
||||||
change->write_change = 0;
|
change->write_change = 0;
|
||||||
else
|
else
|
||||||
change->write_change = EV_CHANGE_DEL;
|
change->write_change = EV_CHANGE_DEL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user