base: Fix hWaitForInput with timeout on POSIX

Authored by bgamari on Apr 21 2017, 11:11 AM.

Description

base: Fix hWaitForInput with timeout on POSIX

This was previously broken (Trac #13252) by
f46369b8a1bf90a3bdc30f2b566c3a7e03672518, which ported the fdReady
function from select to poll and in so doing dropping support for
timeouts. Unfortunately, while select tells us the amount of time not
slept (on Linux anyways; it turns out this is implementation dependent),
poll does not give us this luxury. Consequently, we manually need to
track time slept in this case.

Unfortunately, portably measuring time is hard. Ideally we would use
clock_gettime with the monotonic clock here, but sadly this isn't
supported on most versions of Darwin. Consequently, we instead use
gettimeofday, running the risk of system time changes messing us up.

Test Plan: Validate

Reviewers: simonmar, austin, hvr

Reviewed By: simonmar

Subscribers: rwbarton, thomie

GHC Trac Issues: Trac #13252

Differential Revision: https://phabricator.haskell.org/D3473