summaryrefslogtreecommitdiff
path: root/libraries/base
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-04-23 11:28:37 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-04-23 11:28:37 +0000
commit534875dbe753d567b2c8cc2c1260fd99d19aaa05 (patch)
tree247bf28c6a1533c25b26c1feb4768bbfd28c7102 /libraries/base
parentb12c6878212b7b012e014adf5b2524bccbcbb002 (diff)
downloadhaskell-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.lhs13
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