[GHC] #13995: provide hook for 'setNumCapabilities'

GHC ghc-devs at haskell.org
Wed Jul 19 05:40:26 UTC 2017


#13995: provide hook for 'setNumCapabilities'
-------------------------------------+-------------------------------------
        Reporter:  winter            |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Description changed by winter:

Old description:

> This request is straight forward: i want to run some code when user call
> `setNumCapabilities`.
>
> I'm making a
> [https://github.com/winterland1989/stdio/blob/newFD/System/LowResTimer.hs
> stripped timing wheel implementation], and the problem is obvious: we
> keep an array of timer managers just like I/O managers, but we have to
> ask user to call something like `lowResTimerManagerCapabilitiesChanged`
> so that we can re-allocate new array, which is unreasonable.
>
> The same problem exists in some stripped resource pool implementation, so
> i propose
>
> {{{
> -- this is not exported
> capabilityChangedHook :: IORef (IO ())
> capabilityChangedHook = unsafePerformIO $ newIORef (return ())
>
> -- this is exported to user
> addCapabilityChangedHook :: IO () -> IO ()
> addCapabilityChangedHook f = do
>     atomicModifyIORef' capabilityChangedHook $ \ g -> (g >> f, ())
>
> setNumCapabilities :: ...
> setNumCapabilities = ...
> ...
>    -- somewhere inside setNumCapabilities
>    hook <- readIORef capabilityChangedHook
>    hook
> ...
> }}}

New description:

 This request is straight forward: i want to run some code when user call
 `setNumCapabilities`.

 I'm making a
 [https://github.com/winterland1989/stdio/blob/newFD/System/LowResTimer.hs
 stripped timing wheel implementation], and the problem is obvious: we keep
 an array of timer managers just like I/O managers, but we have to ask user
 to call something like `lowResTimerManagerCapabilitiesChanged` so that we
 can re-allocate new array, which is unreasonable.

 The same problem exists in some stripped resource pool implementation, so
 i propose

 {{{
 -- this is not exported
 capabilityChangedHook :: IORef (IO ())
 capabilityChangedHook = unsafePerformIO $ newIORef (return ())

 -- this is exported to user, and can be called within unsafePerformIO
 addCapabilityChangedHook :: IO () -> IO ()
 addCapabilityChangedHook f = do
     atomicModifyIORef' capabilityChangedHook $ \ g -> (g >> f, ())

 setNumCapabilities :: ...
 setNumCapabilities = ...
 ...
    -- somewhere inside setNumCapabilities
    hook <- readIORef capabilityChangedHook
    hook
 ...
 }}}

--

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


More information about the ghc-tickets mailing list