]> granicus.if.org Git - libevent/commit
Restore our priority-inversion-prevention code with deferreds
authorNick Mathewson <nickm@torproject.org>
Wed, 9 May 2012 15:06:06 +0000 (11:06 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 9 May 2012 16:06:00 +0000 (12:06 -0400)
commitc0e425abdcfc883fa70b6deafdf7327bfb75f02d
treed47ac72fa6388e0354bc9e18a2112b309c27a5d0
parent581b5beb98f45ec73ade6c8026f4fadef4325d4b
Restore our priority-inversion-prevention code with deferreds

Back when deferred_cb stuff had its own queue, the queue was always
executed, but we never ran more than 16 callbacks per iteration.
That made for two problems:

1: Because deferred_cb stuff would always run, and had no priority,
it could cause priority inversion.

2: It doesn't respect the max_dispatch_interval code.

Then, when I refactored deferred_cb to be a special case of
event_callback, that solved the above issues, but made for two more
issues:

3: Because deferred_cb stuff would always get the default priority,
it could could low-priority bufferevents to get too much priority.

4: With code like bufferevent_pair, it's easy to get into a
situation where two deferreds keep adding one another, preventing
the event loop from ever actually scanning for more events.

This commit fixes the above by giving deferreds a better notion of
priorities, and by limiting the number of deferreds that can be
added to the _current_ loop iteration's active queues.  (Extra
deferreds are put into the active_later state.)

That isn't an all-purpose priority inversion solution, of course: for
that, you may need to mess around with max_dispatch_interval.
buffer.c
bufferevent.c
bufferevent_pair.c
bufferevent_sock.c
defer-internal.h
evdns.c
event-internal.h
event.c
http.c
listener.c
test/regress_thread.c