Allow a thread to have multiple select() sets
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 1 Apr 2016 19:42:57 +0000 (15:42 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 5 Apr 2016 19:42:19 +0000 (15:42 -0400)
commit59f4fdbc89c2018872d70c0e7336fafbf5eb69cf
tree46a68c7e61ce5fa9bf438994a1fc25d3b756191a
parentc982802b9896f5b7645d55bffb5c3db8ddd943d9
Allow a thread to have multiple select() sets

The bug was that a single thread selected in multiple locations in the
code.  One select() call would consume the events from another call.  Then
the latter call would sleep, since it's event was gone.

We might still have issues where the same {thread, callsite} combo consumes
events for other invocations from that same location.  This could happen if
a program changes its fdsets.  Once something is selected, the event can be
consumed anywhere.  Here's the scenario:

- select on FD 1
- select on FD 2 (can return for FD 1 or 2)
- assume it was FD 2, and don't check FD 1.  your fd_set from the select
  call will only show FD 2, since we just return whatever you passed us.
- select on FD 1 (the event was consumed, so we're going to wait forever).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/iplib/select.c