X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Control%2FConcurrent.hs;h=b49f7dbe74247227007edfc4f45b31a04bec8357;hb=40fe562f6d01f6076bf00a267dd24f57b45a1933;hp=bdcb8de9ddc4a733c5734afaa40c7074796125df;hpb=ec7d7ba5e16fddc419a5f0da82a66764f5537c55;p=ghc-base.git diff --git a/Control/Concurrent.hs b/Control/Concurrent.hs index bdcb8de..b49f7db 100644 --- a/Control/Concurrent.hs +++ b/Control/Concurrent.hs @@ -47,6 +47,7 @@ module Control.Concurrent ( threadDelay, -- :: Int -> IO () threadWaitRead, -- :: Int -> IO () threadWaitWrite, -- :: Int -> IO () + closeFd, -- :: (Int -> IO ()) -> Int -> IO () #endif -- * Communication abstractions @@ -451,6 +452,9 @@ unsafeResult = either Exception.throwIO return -- | Block the current thread until data is available to read on the -- given file descriptor (GHC only). +-- +-- This will throw an 'IOError' if the file descriptor was closed +-- while this thread was blocked. threadWaitRead :: Fd -> IO () threadWaitRead fd #ifdef mingw32_HOST_OS @@ -471,6 +475,9 @@ threadWaitRead fd -- | Block the current thread until data can be written to the -- given file descriptor (GHC only). +-- +-- This will throw an 'IOError' if the file descriptor was closed +-- while this thread was blocked. threadWaitWrite :: Fd -> IO () threadWaitWrite fd #ifdef mingw32_HOST_OS @@ -480,6 +487,24 @@ threadWaitWrite fd = GHC.Conc.threadWaitWrite fd #endif +-- | Close a file descriptor in a concurrency-safe way (GHC only). If +-- you are using 'threadWaitRead' or 'threadWaitWrite' to perform +-- blocking I\/O, you /must/ use this function to close file +-- descriptors, or blocked threads may not be woken. +-- +-- Any threads that are blocked on the file descriptor via +-- 'threadWaitRead' or 'threadWaitWrite' will be unblocked by having +-- IO exceptions thrown. +closeFd :: (Fd -> IO ()) -- ^ Low-level action that performs the real close. + -> Fd -- ^ File descriptor to close. + -> IO () +closeFd close fd +#ifdef mingw32_HOST_OS + = close fd +#else + = GHC.Conc.closeFd close fd +#endif + #ifdef mingw32_HOST_OS foreign import ccall unsafe "rtsSupportsBoundThreads" threaded :: Bool