thread has received the exception. This is a useful property to know
when dealing with race conditions: eg. if there are two threads that
can kill each other, it is guaranteed that only one of the threads
-will get to kill the other. -}
+will get to kill the other.
+
+If the target thread is currently making a foreign call, then the
+exception will not be raised (and hence 'throwTo' will not return)
+until the call has completed. This is the case regardless of whether
+the call is inside a 'block' or not.
+ -}
throwTo :: ThreadId -> Exception -> IO ()
throwTo (ThreadId id) ex = IO $ \ s ->
case (killThread# id ex s) of s1 -> (# s1, () #)
-- On Windows, we just make a safe call to 'Sleep' to implement threadDelay.
#ifdef mingw32_HOST_OS
-foreign import ccall safe "Sleep" c_Sleep :: CInt -> IO ()
+foreign import stdcall safe "Sleep" c_Sleep :: CInt -> IO ()
#endif
foreign import ccall unsafe "rtsSupportsBoundThreads" threaded :: Bool
s <- peek p
if (s == 0xff)
then return ()
- else c_startSignalHandler (fromIntegral s)
+ else do sp <- peekElemOff handlers (fromIntegral s)
+ quickForkIO (deRefStablePtr sp)
+ return ()
takeMVar prodding
putMVar prodding False
else return ()
putMVar prodding True
-foreign import ccall unsafe "startSignalHandler"
- c_startSignalHandler :: CInt -> IO ()
+foreign import ccall "&signal_handlers" handlers :: Ptr (StablePtr (IO ()))
foreign import ccall "setIOManagerPipe"
c_setIOManagerPipe :: CInt -> IO ()