FIX #3171: make sure we have only one table of signal handlers
authorSimon Marlow <marlowsd@gmail.com>
Thu, 23 Apr 2009 11:28:37 +0000 (11:28 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 23 Apr 2009 11:28:37 +0000 (11:28 +0000)
GHC/Conc.lhs

index 8ed61fe..d6622dd 100644 (file)
@@ -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