projects
/
ghc-base.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Export String from Data.String
[ghc-base.git]
/
Control
/
OldException.hs
diff --git
a/Control/OldException.hs
b/Control/OldException.hs
index
f215432
..
4fa787f
100644
(file)
--- a/
Control/OldException.hs
+++ b/
Control/OldException.hs
@@
-132,7
+132,6
@@
module Control.OldException {-# DEPRECATED "Future versions of base will not sup
#ifdef __GLASGOW_HASKELL__
import GHC.Base
#ifdef __GLASGOW_HASKELL__
import GHC.Base
-import GHC.Num
import GHC.Show
-- import GHC.IO ( IO )
import GHC.IO.Handle.FD ( stdout )
import GHC.Show
-- import GHC.IO ( IO )
import GHC.IO.Handle.FD ( stdout )
@@
-151,7
+150,7
@@
import Hugs.Prelude as New (ExitCode(..))
#endif
import qualified Control.Exception as New
#endif
import qualified Control.Exception as New
-import Control.Exception ( toException, fromException, throw, block, unblock, evaluate, throwIO )
+import Control.Exception ( toException, fromException, throw, block, unblock, mask, evaluate, throwIO )
import System.IO.Error hiding ( catch, try )
import System.IO.Unsafe (unsafePerformIO)
import Data.Dynamic
import System.IO.Error hiding ( catch, try )
import System.IO.Unsafe (unsafePerformIO)
import Data.Dynamic
@@
-452,14
+451,13
@@
bracket
-> (a -> IO c) -- ^ computation to run in-between
-> IO c -- returns the value from the in-between computation
bracket before after thing =
-> (a -> IO c) -- ^ computation to run in-between
-> IO c -- returns the value from the in-between computation
bracket before after thing =
- block (do
+ mask $ \restore -> do
a <- before
r <- catch
a <- before
r <- catch
- (unblock (thing a))
+ (restore (thing a))
(\e -> do { _ <- after a; throw e })
_ <- after a
return r
(\e -> do { _ <- after a; throw e })
_ <- after a
return r
- )
#endif
-- | A specialised variant of 'bracket' with just a computation to run
#endif
-- | A specialised variant of 'bracket' with just a computation to run
@@
-470,13
+468,12
@@
finally :: IO a -- ^ computation to run first
-- was raised)
-> IO a -- returns the value from the first computation
a `finally` sequel =
-- was raised)
-> IO a -- returns the value from the first computation
a `finally` sequel =
- block (do
+ mask $ \restore -> do
r <- catch
r <- catch
- (unblock a)
+ (restore a)
(\e -> do { _ <- sequel; throw e })
_ <- sequel
return r
(\e -> do { _ <- sequel; throw e })
_ <- sequel
return r
- )
-- | A variant of 'bracket' where the return value from the first computation
-- is not required.
-- | A variant of 'bracket' where the return value from the first computation
-- is not required.
@@
-491,12
+488,11
@@
bracketOnError
-> (a -> IO c) -- ^ computation to run in-between
-> IO c -- returns the value from the in-between computation
bracketOnError before after thing =
-> (a -> IO c) -- ^ computation to run in-between
-> IO c -- returns the value from the in-between computation
bracketOnError before after thing =
- block (do
+ mask $ \restore -> do
a <- before
catch
a <- before
catch
- (unblock (thing a))
+ (restore (thing a))
(\e -> do { _ <- after a; throw e })
(\e -> do { _ <- after a; throw e })
- )
-- -----------------------------------------------------------------------------
-- Asynchronous exceptions
-- -----------------------------------------------------------------------------
-- Asynchronous exceptions
@@
-523,7
+519,7
@@
easy to introduce race conditions by the over zealous use of
-}
{- $block_handler
-}
{- $block_handler
-There\'s an implied 'block' around every exception handler in a call
+There\'s an implied 'mask_' around every exception handler in a call
to one of the 'catch' family of functions. This is because that is
what you want most of the time - it eliminates a common race condition
in starting an exception handler, because there may be no exception
to one of the 'catch' family of functions. This is because that is
what you want most of the time - it eliminates a common race condition
in starting an exception handler, because there may be no exception
@@
-533,10
+529,9
@@
handler, though, we have time to install a new exception handler
before being interrupted. If this weren\'t the default, one would have
to write something like
before being interrupted. If this weren\'t the default, one would have
to write something like
-> block (
-> catch (unblock (...))
+> mask $ \restore ->
+> catch (restore (...))
> (\e -> handler)
> (\e -> handler)
-> )
If you need to unblock asynchronous exceptions again in the exception
handler, just use 'unblock' as normal.
If you need to unblock asynchronous exceptions again in the exception
handler, just use 'unblock' as normal.
@@
-544,13
+539,13
@@
handler, just use 'unblock' as normal.
Note that 'try' and friends /do not/ have a similar default, because
there is no exception handler in this case. If you want to use 'try'
in an asynchronous-exception-safe way, you will need to use
Note that 'try' and friends /do not/ have a similar default, because
there is no exception handler in this case. If you want to use 'try'
in an asynchronous-exception-safe way, you will need to use
-'block'.
+'mask'.
-}
{- $interruptible
Some operations are /interruptible/, which means that they can receive
-}
{- $interruptible
Some operations are /interruptible/, which means that they can receive
-asynchronous exceptions even in the scope of a 'block'. Any function
+asynchronous exceptions even in the scope of a 'mask'. Any function
which may itself block is defined as interruptible; this includes
'Control.Concurrent.MVar.takeMVar'
(but not 'Control.Concurrent.MVar.tryTakeMVar'),
which may itself block is defined as interruptible; this includes
'Control.Concurrent.MVar.takeMVar'
(but not 'Control.Concurrent.MVar.tryTakeMVar'),
@@
-558,11
+553,10
@@
and most operations which perform
some I\/O with the outside world. The reason for having
interruptible operations is so that we can write things like
some I\/O with the outside world. The reason for having
interruptible operations is so that we can write things like
-> block (
+> mask $ \restore -> do
> a <- takeMVar m
> a <- takeMVar m
-> catch (unblock (...))
+> catch (restore (...))
> (\e -> ...)
> (\e -> ...)
-> )
if the 'Control.Concurrent.MVar.takeMVar' was not interruptible,
then this particular
if the 'Control.Concurrent.MVar.takeMVar' was not interruptible,
then this particular