X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=System%2FEvent%2FThread.hs;h=59bf7e8ffebaa8dcdc0f1d428cd4fd87b694a574;hb=b35c301de87a9440b320994dcc788d44d80bcc45;hp=4c2170d00bfcd1070d13a67d01650141ed002eeb;hpb=b22112520b01c4906eebd0b6894d4bf2665c11e2;p=ghc-base.git diff --git a/System/Event/Thread.hs b/System/Event/Thread.hs index 4c2170d..59bf7e8 100644 --- a/System/Event/Thread.hs +++ b/System/Event/Thread.hs @@ -10,7 +10,6 @@ module System.Event.Thread , registerDelay ) where -import Control.Exception (SomeException, catch, throw) import Data.IORef (IORef, newIORef, readIORef, writeIORef) import Data.Maybe (Maybe(..)) import Foreign.C.Error (eBADF, errnoToIOError) @@ -19,9 +18,9 @@ import GHC.Base import GHC.Conc.Sync (TVar, ThreadId, ThreadStatus(..), atomically, forkIO, labelThread, modifyMVar_, newTVar, sharedCAF, threadStatus, writeTVar) +import GHC.IO (mask_, onException) import GHC.IO.Exception (ioError) import GHC.MVar (MVar, newEmptyMVar, newMVar, putMVar, takeMVar) -import GHC.Real (fromIntegral) import System.Event.Internal (eventIs, evtClose) import System.Event.Manager (Event, EventManager, evtRead, evtWrite, loop, new, registerFd, unregisterFd_, registerTimeout) @@ -36,12 +35,11 @@ import System.Posix.Types (Fd) -- when the delay has expired, but the thread will never continue to -- run /earlier/ than specified. threadDelay :: Int -> IO () -threadDelay usecs = do +threadDelay usecs = mask_ $ do Just mgr <- readIORef eventManager m <- newEmptyMVar reg <- registerTimeout mgr usecs (putMVar m ()) - takeMVar m `catch` \(e::SomeException) -> - M.unregisterTimeout mgr reg >> throw e + takeMVar m `onException` M.unregisterTimeout mgr reg -- | Set the value of returned TVar to True after a given number of -- microseconds. The caveats associated with threadDelay also apply. @@ -86,12 +84,11 @@ closeFdWith close fd = do M.closeFd mgr close fd threadWait :: Event -> Fd -> IO () -threadWait evt fd = do +threadWait evt fd = mask_ $ do m <- newEmptyMVar Just mgr <- readIORef eventManager reg <- registerFd mgr (\reg e -> unregisterFd_ mgr reg >> putMVar m e) fd evt - evt' <- takeMVar m `catch` \(e::SomeException) -> - unregisterFd_ mgr reg >> throw e + evt' <- takeMVar m `onException` unregisterFd_ mgr reg if evt' `eventIs` evtClose then ioError $ errnoToIOError "threadWait" eBADF Nothing Nothing else return ()