base: fdReady(): Fix timeouts > ~49 days overflowing. Fixes #14262.
authorNiklas Hamb├╝chen <mail@nh2.me>
Thu, 23 Nov 2017 18:17:24 +0000 (13:17 -0500)
committerBen Gamari <ben@smart-cactus.org>
Fri, 24 Nov 2017 16:36:55 +0000 (11:36 -0500)
commitf209e6672fe33235bd1d4c20c87894021cf3bbc8
treec8ced3817f0649ca7ff005d4029e09418a530d57
parent99089fc9240c39726d5b2a50942fb693c48c2bcd
base: fdReady(): Fix timeouts > ~49 days overflowing. Fixes #14262.

On 64-bit UNIX and Windows, Haskell `Int` has 64 bits
but C `int msecs` has 32 bits, resulting in an overflow.

This commit fixes it by switching fdReady() to take int64_t,
into which a Haskell `Int` will always fit.

(Note we could not switch to `long long` because that is
32 bit on 64-bit Windows machines.)

Further, to be able to actually wait longer than ~49 days,
we put loops around the waiting syscalls (they all accept only
32-bit integers).

Note the timer signal would typically interrupt the syscalls
before the ~49 days are over, but you can run Haskell programs
without the timer signal, an we want it to be correct in all
cases.

Reviewers: bgamari, austin, hvr, NicolasT, Phyx

Reviewed By: bgamari, Phyx

Subscribers: syd, Phyx, rwbarton, thomie

GHC Trac Issues: #14262

Differential Revision: https://phabricator.haskell.org/D4011
libraries/base/Control/Concurrent.hs
libraries/base/GHC/IO/FD.hs
libraries/base/cbits/inputReady.c
libraries/base/include/HsBase.h
rts/RtsSymbols.c