Commit fdf92554349bc64a0f19c4ad7207608cc5482386

  • avatar
  • Peter Simons (Committer)
  • Wed Feb 20 22:41:27 CET 2008
  • avatar
  • Peter Simons <simons @cr…p.tyo> (Author)
  • Wed Feb 20 22:41:27 CET 2008
io: drop timeout function; ghc 6.8.1 has it in base
  
1313
1414import Data.List
1515import Data.Maybe
16import Data.Dynamic ( Typeable, fromDynamic )
17import Data.Unique ( Unique, newUnique )
18import Control.Concurrent ( forkIO, threadDelay, myThreadId, killThread )
16import Data.Dynamic ( Typeable )
17import Control.Concurrent ( forkIO )
1918import Control.Exception
2019import Control.Monad.RWS hiding ( local )
2120import System.IO
2221import System.IO.Error
22import System.Timeout
2323import Network ( listenOn, PortID(..) )
2424import Network.Socket
2525import Text.ParserCombinators.Parsec.Rfc2821
5252 when (len' > 0) (copyArray ptr ptr' len')
5353 return (Buf cap ptr (fromIntegral len'))
5454
55-- |Timeouts are represented in microseconds.
56
5557type Timeout = Int
5658
5759-- |If there is space, read and append more octets; then
228228
229229safeFlush :: WriteHandle -> Smtpd ()
230230safeFlush hOut = safeWrite (hFlush hOut)
231
232
233
234
235data TimeoutEvent = TimeoutEvent Unique deriving (Eq, Typeable)
236
237
238timeout :: Int -> IO a -> IO (Maybe a)
239timeout n f
240 | n < 0 = fmap Just f
241 | n == 0 = return Nothing
242 | otherwise = do
243 pid <- myThreadId
244 ex <- fmap TimeoutEvent newUnique
245 handleJust (\e -> dynExceptions e >>= fromDynamic >>= guard . (ex ==))
246 (\_ -> return Nothing)
247 (bracket (forkIO (threadDelay n >> throwDynTo pid ex))
248 (killThread)
249 (\_ -> fmap Just f))