@@ -6,6 +6,7 @@ module Timeout
11import qualified Data.IORef as I
12import qualified Data.IORef as I
@@ -13,9 +14,11 @@ import Control.Concurrent (forkIO, threadDelay)
13import Control.Monad (forever)
14import Control.Monad (forever)
14import qualified Control.Exception as E
15import qualified Control.Exception as E
17+-- FIXME implement stopManager
16newtype Manager = Manager (I.IORef [Handle])
19newtype Manager = Manager (I.IORef [Handle])
17data Handle = Handle (IO ()) (I.IORef State)
20data Handle = Handle (IO ()) (I.IORef State)
18−data State = Active | Inactive | Paused
21+data State = Active | Inactive | Paused | Canceled
20initialize :: Int -> IO Manager
23initialize :: Int -> IO Manager
21initialize timeout = do
24initialize timeout = do
@@ -34,6 +37,7 @@ initialize timeout = do
34 Inactive -> do
37 Inactive -> do
35 onTimeout `E.catch` ignoreAll
38 onTimeout `E.catch` ignoreAll
36 go rest front
39 go rest front
40+ Canceled -> go rest front
37 _ -> go rest (front . (:) m)
41 _ -> go rest (front . (:) m)
38 go' Active = Inactive
42 go' Active = Inactive
@@ -48,7 +52,8 @@ register (Manager ref) onTimeout = do
48 I.atomicModifyIORef ref (\x -> (h : x, ()))
52 I.atomicModifyIORef ref (\x -> (h : x, ()))
51−tickle, pause, resume :: Handle -> IO ()
55+tickle, pause, resume, cancel :: Handle -> IO ()
52tickle (Handle _ iactive) = I.writeIORef iactive Active
56tickle (Handle _ iactive) = I.writeIORef iactive Active
53pause (Handle _ iactive) = I.writeIORef iactive Paused
57pause (Handle _ iactive) = I.writeIORef iactive Paused
54resume = tickle
58resume = tickle
59+cancel (Handle _ iactive) = I.writeIORef iactive Canceled