[GHC] #7325: threadDelay mistreats minBound and maxBound in some configurations

GHC ghc-devs at haskell.org
Sun Dec 18 01:01:51 UTC 2016


#7325: threadDelay mistreats minBound and maxBound in some configurations
-------------------------------------+-------------------------------------
        Reporter:  joeyadams         |                Owner:
            Type:  bug               |               Status:  patch
        Priority:  high              |            Milestone:  8.2.1
       Component:  Runtime System    |              Version:  7.6.1
      Resolution:                    |             Keywords:
Operating System:  Windows           |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  Incorrect result  |            Test Case:
  at runtime                         |  base/tests/T8089
      Blocked By:                    |             Blocking:
 Related Tickets:  #9722             |  Differential Rev(s):  Phab:D2861
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by Ben Gamari <ben@…>):

 In [changeset:"2d1beb1ec84c2d22c6be83944ef4ea8626abd76a/ghc"
 2d1beb1e/ghc]:
 {{{
 #!CommitTicketReference repository="ghc"
 revision="2d1beb1ec84c2d22c6be83944ef4ea8626abd76a"
 rts/win32/IOManager: Fix integer types

 This code has been broken on 64-bit systems for some time: the length
 and timeout arguments of `addIORequest` and `addDelayRequest`,
 respectively, were declared as `int`. However, they were passed Haskell
 integers from their respective primops. Integer overflow and madness
 ensued. This resulted in #7325 and who knows what else.

 Also, there were a few left-over `BOOL`s in here which were not passed
 to Windows system calls; these were changed to C99 `bool`s.

 However, there is still a bit of signedness inconsistency within the
 `delay#` call-chain,

  * `GHC.Conc.IO.threadDelay` and the `delay#` primop accept `Int`
    arguments

  * The `delay#` implementation in `PrimOps.cmm` expects the timeout as
    a `W_`

  * `AsyncIO.c:addDelayRequest` expects an `HsInt` (was `int` prior to
    this patch)

  * `IOManager.c:AddDelayRequest` expects an `HsInt`` (was `int`)

  * The Windows `Sleep` function expects a `DWORD` (which is unsigned)

 Test Plan: Validate on Windows

 Reviewers: erikd, austin, simonmar, Phyx

 Reviewed By: Phyx

 Subscribers: thomie

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

 GHC Trac Issues: #7325
 }}}

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/7325#comment:14>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list