on master help sign in
adding killIfExist.
d720123Kazu Yamamoto
warp/Network/Wai/Handler/Warp/Timeout.hs+7−4
@@ -19,13 +19,13 @@ module Network.Wai.Handler.Warp.Timeout (
19 ) where
19 ) where
20
20
21#if MIN_VERSION_base(4,6,0)
21#if MIN_VERSION_base(4,6,0)
22−import Control.Concurrent (mkWeakThreadId)
22+import Control.Concurrent (mkWeakThreadId, ThreadId)
23#else
23#else
24−import GHC.Conc.Sync (ThreadId (..))
24+import Control.Concurrent (ThreadId(..))
25import GHC.Exts (mkWeak#)
25import GHC.Exts (mkWeak#)
26import GHC.IO (IO (IO))
26import GHC.IO (IO (IO))
27−import GHC.Weak (Weak (..))
28#endif
27#endif
28+import GHC.Weak (Weak (..))
29import Control.Concurrent (forkIO, threadDelay, myThreadId, killThread)
29import Control.Concurrent (forkIO, threadDelay, myThreadId, killThread)
30import qualified Control.Exception as E
30import qualified Control.Exception as E
31import Control.Monad (forever, void)
31import Control.Monad (forever, void)
@@ -115,7 +115,10 @@ register (Manager ref) onTimeout = do
115registerKillThread :: Manager -> IO Handle
115registerKillThread :: Manager -> IO Handle
116registerKillThread m = do
116registerKillThread m = do
117 wtid <- myThreadId >>= mkWeakThreadId
117 wtid <- myThreadId >>= mkWeakThreadId
118+ register m $ killIfExist wtid
119+
120+killIfExist :: Weak ThreadId -> TimeoutAction
118− register m $ deRefWeak wtid >>= maybe (return ()) killThread
121+killIfExist wtid = deRefWeak wtid >>= maybe (return ()) killThread
119
122
120#if !MIN_VERSION_base(4,6,0)
123#if !MIN_VERSION_base(4,6,0)
121mkWeakThreadId :: ThreadId -> IO (Weak ThreadId)
124mkWeakThreadId :: ThreadId -> IO (Weak ThreadId)