From 3c75227f4383ee93e207c48ac6d1c6acdb48062b Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 23 Apr 2009 11:28:37 +0000 Subject: [PATCH] FIX #3171: make sure we have only one table of signal handlers --- GHC/Conc.lhs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/GHC/Conc.lhs b/GHC/Conc.lhs index 8ed61fe..d6622dd 100644 --- a/GHC/Conc.lhs +++ b/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 -- 1.7.10.4