diff options
author | Simon Marlow <marlowsd@gmail.com> | 2009-04-23 11:28:37 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2009-04-23 11:28:37 +0000 |
commit | 534875dbe753d567b2c8cc2c1260fd99d19aaa05 (patch) | |
tree | 247bf28c6a1533c25b26c1feb4768bbfd28c7102 /libraries/base | |
parent | b12c6878212b7b012e014adf5b2524bccbcbb002 (diff) | |
download | haskell-534875dbe753d567b2c8cc2c1260fd99d19aaa05.tar.gz |
FIX #3171: make sure we have only one table of signal handlers
Diffstat (limited to 'libraries/base')
-rw-r--r-- | libraries/base/GHC/Conc.lhs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/libraries/base/GHC/Conc.lhs b/libraries/base/GHC/Conc.lhs index 8ed61fefea..d6622ddb2e 100644 --- a/libraries/base/GHC/Conc.lhs +++ b/libraries/base/GHC/Conc.lhs @@ -1225,7 +1225,18 @@ type HandlerFun = ForeignPtr Word8 -> IO () signal_handlers :: MVar (IOArray Int (Maybe (HandlerFun,Dynamic))) signal_handlers = unsafePerformIO $ do arr <- newIOArray (0,maxSig) Nothing - newMVar arr + m <- newMVar arr + block $ do + stable_ref <- newStablePtr m + let ref = castStablePtrToPtr stable_ref + ref2 <- getOrSetSignalHandlerStore ref + if ref==ref2 + then return m + else do freeStablePtr stable_ref + deRefStablePtr (castPtrToStablePtr ref2) + +foreign import ccall unsafe "getOrSetSignalHandlerStore" + getOrSetSignalHandlerStore :: Ptr a -> IO (Ptr a) setHandler :: Signal -> Maybe (HandlerFun,Dynamic) -> IO (Maybe (HandlerFun,Dynamic)) setHandler sig handler = do |