Portability | uses mdo |
---|
Timeout implementation for performing operations in the IO monad with a timeout added. Both using Maybe and exceptions to handle timeouts are supported.
Timeouts can be implemented in GHC with either a global handler or a per-timeout thread which sleeps until the timeout. The latter is used in this module. Blocking on foreign calls can cause problems as GHC has no way of interrupting such threads. The module provides a slightly slower alternative implementation which returns even if the computation has blocked on a foreign call. This should not be an issue unless -threaded is used.
The timeouts are currently limited to a maximum of about 2000 seconds. This is a feature of threadDelay, but supporting longer timeouts is certainly possible if that is desirable.
- withTimeOut :: Int -> IO a -> IO a
- withTimeOutMaybe :: Int -> IO a -> IO (Maybe a)
- withSafeTimeOut :: Int -> IO a -> IO a
- withSafeTimeOutMaybe :: Int -> IO a -> IO (Maybe a)
- data TimeOutException = TimeOutException
- second :: Int
Documentation
withTimeOut :: Int -> IO a -> IO aSource
This is the normal timeout handler. It throws a dynamic exception (TimeOutException), if the timeout occurs.
withTimeOutMaybe :: Int -> IO a -> IO (Maybe a)Source
This is the normal timeout handler. If the computation fails or the timeout is reached it returns Nothing.
withSafeTimeOut :: Int -> IO a -> IO aSource
Like timeOut, but additionally it works even if the computation is blocking async exceptions (explicitely or by a blocking FFI call). This consumes more resources than timeOut, but is still quite fast.