[GHC] #13995: provide hook for 'setNumCapabilities'
GHC
ghc-devs at haskell.org
Wed Jul 19 05:29:14 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 if 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 proposed
>
> {{{
> -- 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
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:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list