Dongsheng Song reports that when building on windows with NDEBUG, you
run into an attempt to do EVUTIL_ASSERT(x) where x is a bitfield,
which turns into _EVUTIL_NIL_CONDITION(x), which takes sizeof(x),
which is illegal. This patch fixes _EVUTIL_NIL_CONDITION to work on
bitfields too.
The old code was more or less:
if (op == X && errno == FOO) {
...
} else if (op == Y && errno == BAR) {
...
}
but really we wanted to do a switch (op) to avoid needless checks
and branches.
This patch leaves the indentation a little weird so as to make it
easier to see what changed; the next patch will fix the indentation.
This should save a bunch of branches by doing instead a lookup in a
nice static table.
To ensure correctness, the table is generated from a Python script,
included with this commit.
Previously, debug logs were turned on if you built with -DUSE_DEBUG
and off otherwise. This make builds with -DUSE_DEBUG hideously slow
and other builds unable to get debug logs.
This is based off a patch by Ralph Castain from October. It tries a
little harder to avoid needless function calls, it doesn't require
stdbool, and makes the controlling parameter a mask rather than a
boolean so that we can later support enabling only the debugging
messages for the parts of Libevent you're trying to debug.
It is (in my benchmarks) way faster than _ftime, though the
conversion process is not so straightforward. In theory, it can
have a better granularity too, though in practice who knows what
you're getting.
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