Fix OSX RTS crash due to bad coercion.
authorMerijn Verstraaten <merijn@inconsistent.nl>
Wed, 24 Jul 2013 13:37:25 +0000 (14:37 +0100)
committerAustin Seipp <aseipp@pobox.com>
Thu, 7 Nov 2013 10:11:09 +0000 (04:11 -0600)
commit95a74f9b091a8b512828b6930ea46d7ac55be76b
treeda5fc33b6cb2c3767dd49ce9c7421fd2e71596b4
parentfe70999f28f0f658ba00647c1178138eeaf4462c
Fix OSX RTS crash due to bad coercion.

The code coerces Int to CInt, which causes an overflow if Int is bigger
than CInt (for example, Int 64bit, CInt 32 bit). This results in a
negative value being passed to c_poll.

On Linux all negative values are treated as infinite timeouts, which
gives subtly wrong semantics, but is unlikely to produce actual bugs.

OSX insists that only -1 is a valid value for infinite timeout, any
other negative timeout is treated as an invalid argument.

This patch replaces the c_poll call with a loop that handles the
overflow gracefully by chaining multiple calls to poll to obtain the
proper semantics.

Signed-off-by: Austin Seipp <aseipp@pobox.com>
GHC/Event/Poll.hsc