projects
/
ghc-base.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
f779a4e
)
FIX #3171: make sure we have only one table of signal handlers
author
Simon Marlow
<marlowsd@gmail.com>
Thu, 23 Apr 2009 11:28:37 +0000
(11:28 +0000)
committer
Simon Marlow
<marlowsd@gmail.com>
Thu, 23 Apr 2009 11:28:37 +0000
(11:28 +0000)
GHC/Conc.lhs
patch
|
blob
|
history
diff --git
a/GHC/Conc.lhs
b/GHC/Conc.lhs
index
8ed61fe
..
d6622dd
100644
(file)
--- 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
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
setHandler :: Signal -> Maybe (HandlerFun,Dynamic) -> IO (Maybe (HandlerFun,Dynamic))
setHandler sig handler = do