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:
Mike Smellie 2010-07-19 14:18:31 +12:00 committed by Nick Mathewson
parent 2570ae50d3
commit 04ba27ebf2

19
evmap.c
View File

@ -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;