1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
{-# LANGUAGE CPP #-}
module Network.Wai.Handler.Warp.Windows
( windowsThreadBlockHack
) where
#if WINDOWS
import Control.Exception
import Control.Concurrent.MVar
import Control.Concurrent
import Control.Monad
windowsThreadBlockHack :: IO a -> IO a
windowsThreadBlockHack act =
do
var <- newEmptyMVar :: IO (MVar (Either SomeException a))
void . forkIO $ try act >>= putMVar var
res <- takeMVar var
case res of
Left e -> throwIO e
Right r -> return r
#else
windowsThreadBlockHack :: IO a -> IO a
windowsThreadBlockHack = id
#endif
|