epoll: Clean up epoll_wait and stop excess polling
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 27 Sep 2016 18:23:05 +0000 (14:23 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 6 Oct 2016 19:41:48 +0000 (15:41 -0400)
commit09c94be4fe62aa3e1cdb21d4639fae1a24b4e54e
treef0eb1283c377c5b7703dd5ca57c58fdcf2ccbdeb
parent850a8755f7703a54be73fbe660f1be07d83911ca
epoll: Clean up epoll_wait and stop excess polling

The old for loop would keep polling up to maxevents.  As soon as it fails
once, we should stop.  At that moment, the CEQ was empty and we should
either block or return.

Also, this fixes a subtle issue.  If we extracted a message but it didn't
have an epoll event, we were still advancing 'i', which means we'd have a
hole in our events (so, a gibberish event) and we'd skip the last event.
Alas, this was *a* bug, but not the bug I was looking for.

This also cleans up a bit of the logic for after we block, thanks to the
__epoll_wait_poll helper.

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