@@ -1,5 +1,6 @@
11{-# LANGUAGE CPP #-}
22{-# LANGUAGE BangPatterns #-}
3+{-# LANGUAGE DeriveDataTypeable #-}
34{-# LANGUAGE UnboxedTuples, MagicHash #-}
45
56-- |
@@ -46,13 +47,14 @@ import GHC.Conc (ThreadId(..))
4647import GHC.Exts (mkWeak#)
4748import GHC.IO (IO (IO))
4849#endif
49−import Control.Concurrent (threadDelay, myThreadId, killThread)
50+import Control.Concurrent (threadDelay, myThreadId)
5051import qualified Control.Exception as E
5152import GHC.Weak (Weak (..))
5253import Network.Wai.Handler.Warp.IORef (IORef)
5354import qualified Network.Wai.Handler.Warp.IORef as I
5455import Network.Wai.Handler.Warp.Thread
5556import System.Mem.Weak (deRefWeak)
57+import Data.Typeable (Typeable)
5658
5759----------------------------------------------------------------
5860
@@ -130,7 +132,13 @@ registerKillThread m = do
130132-- deRefWeak checks if ThreadId referenced by the weak reference
131133-- exists. If exists, it means that the thread is alive.
132134killIfExist :: Weak ThreadId -> TimeoutAction
133−killIfExist wtid = deRefWeak wtid >>= maybe (return ()) killThread
135+killIfExist wtid = deRefWeak wtid >>= maybe (return ()) (flip E.throwTo TimeoutThread)
136+
137+data TimeoutThread = TimeoutThread
138+ deriving Typeable
139+instance E.Exception TimeoutThread
140+instance Show TimeoutThread where
141+ show TimeoutThread = "Thread killed by Warp's timeout reaper"
134142
135143#if !MIN_VERSION_base(4,6,0)
136144mkWeakThreadId :: ThreadId -> IO (Weak ThreadId)