base: Fix hWaitForInput with timeout on POSIX
authorBen Gamari <bgamari.foss@gmail.com>
Fri, 21 Apr 2017 16:11:28 +0000 (12:11 -0400)
committerBen Gamari <ben@smart-cactus.org>
Fri, 21 Apr 2017 16:11:36 +0000 (12:11 -0400)
commite5732d2a28dfb8a754ee73e124e3558222a543bb
treed2481cc029034b90de02db594aeacc2170c84d51
parent3672cf6d0962dd6bf0a05e6e3433c81bbdf04a11
base: Fix hWaitForInput with timeout on POSIX

This was previously broken (#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: #13252

Differential Revision: https://phabricator.haskell.org/D3473
libraries/base/cbits/inputReady.c
libraries/base/tests/T13525.hs
libraries/base/tests/all.T