]> granicus.if.org Git - libevent/commitdiff
Use current event set rather than current pending change when deciding whether to...
authorMike Smellie <mike.j.smellie@gmail.com>
Mon, 19 Jul 2010 02:18:31 +0000 (14:18 +1200)
committerNick Mathewson <nickm@torproject.org>
Thu, 16 Dec 2010 18:21:25 +0000 (13:21 -0500)
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

evmap.c

diff --git a/evmap.c b/evmap.c
index 5521626cf2431137f542c94d406801fef2833328..3bcad1172c8ed4fc3ee30b0049e92da43201b6df 100644 (file)
--- a/evmap.c
+++ b/evmap.c
@@ -685,14 +685,11 @@ event_changelist_del(struct event_base *base, evutil_socket_t fd, short old, sho
        if (!change)
                return -1;
 
-       /* A delete removes any previous add, rather than replacing it:
-          on those platforms where "add, delete, dispatch" is not the same
-          as "no-op, dispatch", we want the no-op behavior.
-
-          As well as checking the current operation we should also check
-          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.
+       /* A delete on an event set that doesn't contain the event to be
+          deleted produces a no-op.  This effectively emoves any previous
+          uncommitted add, rather than replacing it: on those platforms where
+          "add, delete, dispatch" is not the same as "no-op, dispatch", we
+          want the no-op behavior.
 
           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
@@ -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 (!(change->old_events & (EV_READ | EV_SIGNAL)) &&
-                   (change->read_change & EV_CHANGE_ADD))
+               if (!(change->old_events & (EV_READ | EV_SIGNAL)))
                        change->read_change = 0;
                else
                        change->read_change = EV_CHANGE_DEL;
        }
        if (events & EV_WRITE) {
-               if (!(change->old_events & EV_WRITE) &&
-                   (change->write_change & EV_CHANGE_ADD))
+               if (!(change->old_events & EV_WRITE))
                        change->write_change = 0;
                else
                        change->write_change = EV_CHANGE_DEL;