New asynchronous exception control API (base parts)
[ghc-base.git] / Foreign / Marshal / Pool.hs
index 0580668..f15d048 100644 (file)
@@ -47,8 +47,9 @@ module Foreign.Marshal.Pool (
 #ifdef __GLASGOW_HASKELL__
 import GHC.Base              ( Int, Monad(..), (.), not )
 import GHC.Err               ( undefined )
-import GHC.Exception         ( block, unblock, throw, catchException )
-import GHC.IOBase            ( IO, IORef, newIORef, readIORef, writeIORef, )
+import GHC.Exception         ( throw )
+import GHC.IO                ( IO, mask, catchAny )
+import GHC.IORef             ( IORef, newIORef, readIORef, writeIORef )
 import GHC.List              ( elem, length )
 import GHC.Num               ( Num(..) )
 #else
@@ -56,7 +57,7 @@ import Data.IORef            ( IORef, newIORef, readIORef, writeIORef )
 #if defined(__NHC__)
 import IO                    ( bracket )
 #else
-import Control.Exception     ( bracket )
+import Control.Exception.Base ( bracket )
 #endif
 #endif
 
@@ -96,10 +97,10 @@ freePool (Pool pool) = readIORef pool >>= freeAll
 withPool :: (Pool -> IO b) -> IO b
 #ifdef __GLASGOW_HASKELL__
 withPool act =   -- ATTENTION: cut-n-paste from Control.Exception below!
-   block (do
+   mask (\restore -> do
       pool <- newPool
-      val <- catchException
-                (unblock (act pool))
+      val <- catchAny
+                (restore (act pool))
                 (\e -> do freePool pool; throw e)
       freePool pool
       return val)
@@ -142,7 +143,7 @@ pooledRealloc = pr undefined
 pooledReallocBytes :: Pool -> Ptr a -> Int -> IO (Ptr a)
 pooledReallocBytes (Pool pool) ptr size = do
    let cPtr = castPtr ptr
-   throwIf (not . (cPtr `elem`)) (\_ -> "pointer not in pool") (readIORef pool)
+   _ <- throwIf (not . (cPtr `elem`)) (\_ -> "pointer not in pool") (readIORef pool)
    newPtr <- reallocBytes cPtr size
    ptrs <- readIORef pool
    writeIORef pool (newPtr : delete cPtr ptrs)