Skip to content

Proposal: Retrieving the System Event Manager

When you want to use the system event manager (the one started by the RTS) you currently have to do something like this:

{-# LANGUAGE ForeignFunctionInterface #-}

import System.Event (EventManager)
import GHC.Conc.Sync (sharedCAF)
import Foreign.Ptr (Ptr)
import Data.IORef (IORef, newIORef, readIORef)
import System.IO.Unsafe (unsafePerformIO)

main = do
  Just mgr <- readIORef eventManager
  ...

eventManager :: IORef (Maybe EventManager)
eventManager = unsafePerformIO $ do
    em <- newIORef Nothing
    sharedCAF em getOrSetSystemEventThreadEventManagerStore
{-# NOINLINE eventManager #-}

foreign import ccall unsafe "getOrSetSystemEventThreadEventManagerStore"
    getOrSetSystemEventThreadEventManagerStore :: Ptr a -> IO (Ptr a)

I propose to abstract this ugliness in a function:

getSystemEventManager :: IO (Maybe EventManager)
getSystemEventManager = readIORef eventManager

and export it from GHC.Event.

I don't think this needs to go through the library submission process since the module is GHC specific.

See the thread on the libraries list.

Trac metadata
Trac field Value
Version 7.0.3
Type Task
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component libraries/base
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information