final revision to GArrow classes
[ghc-base.git] / Foreign / ForeignPtr.hs
index 21485db..b91ffeb 100644 (file)
@@ -1,4 +1,5 @@
-{-# OPTIONS_GHC -fno-implicit-prelude #-}
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
+
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Foreign.ForeignPtr
 
 module Foreign.ForeignPtr
         ( 
-       -- * Finalised data pointers
-         ForeignPtr
-       , FinalizerPtr
+        -- * Finalised data pointers
+          ForeignPtr
+        , FinalizerPtr
 #if defined(__HUGS__) || defined(__GLASGOW_HASKELL__)
-       , FinalizerEnvPtr
+        , FinalizerEnvPtr
 #endif
-       -- ** Basic operations
+        -- ** Basic operations
         , newForeignPtr
         , newForeignPtr_
         , addForeignPtrFinalizer
 #if defined(__HUGS__) || defined(__GLASGOW_HASKELL__)
-       , newForeignPtrEnv
-       , addForeignPtrFinalizerEnv
+        , newForeignPtrEnv
+        , addForeignPtrFinalizerEnv
 #endif
-       , withForeignPtr
+        , withForeignPtr
 
 #ifdef __GLASGOW_HASKELL__
-       , finalizeForeignPtr
+        , finalizeForeignPtr
 #endif
 
-       -- ** Low-level operations
-       , unsafeForeignPtrToPtr
-       , touchForeignPtr
-       , castForeignPtr
+        -- ** Low-level operations
+        , unsafeForeignPtrToPtr
+        , touchForeignPtr
+        , castForeignPtr
 
-       -- ** Allocating managed memory
-       , mallocForeignPtr
-       , mallocForeignPtrBytes
-       , mallocForeignPtrArray
-       , mallocForeignPtrArray0
+        -- ** Allocating managed memory
+        , mallocForeignPtr
+        , mallocForeignPtrBytes
+        , mallocForeignPtrArray
+        , mallocForeignPtrArray0
         ) 
-       where
+        where
 
 import Foreign.Ptr
 
@@ -73,19 +74,19 @@ import Hugs.ForeignPtr
 #endif
 
 #ifndef __NHC__
-import Foreign.Storable        ( Storable(sizeOf) )
+import Foreign.Storable ( Storable(sizeOf) )
 #endif
 
 #ifdef __GLASGOW_HASKELL__
 import GHC.Base
-import GHC.IOBase
+-- import GHC.IO
 import GHC.Num
-import GHC.Err         ( undefined )
+import GHC.Err          ( undefined )
 import GHC.ForeignPtr
 #endif
 
 #if !defined(__NHC__) && !defined(__GLASGOW_HASKELL__)
-import Foreign.Marshal.Alloc   ( malloc, mallocBytes, finalizerFree )
+import Foreign.Marshal.Alloc    ( malloc, mallocBytes, finalizerFree )
 
 instance Eq (ForeignPtr a) where 
     p == q  =  unsafeForeignPtrToPtr p == unsafeForeignPtrToPtr q
@@ -101,13 +102,10 @@ instance Show (ForeignPtr a) where
 #ifndef __NHC__
 newForeignPtr :: FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
 -- ^Turns a plain memory reference into a foreign pointer, and
--- associates a finaliser with the reference.  The finaliser will be executed
--- after the last reference to the foreign object is dropped.  Note that there
--- is no guarantee on how soon the finaliser is executed after the last
--- reference was dropped; this depends on the details of the Haskell storage
--- manager.  Indeed, there is no guarantee that the finalizer is executed at
--- all; a program may exit with finalizers outstanding.  (This is true
--- of GHC, other implementations may give stronger guarantees).
+-- associates a finalizer with the reference.  The finalizer will be
+-- executed after the last reference to the foreign object is dropped.
+-- There is no guarantee of promptness, however the finalizer will be
+-- executed before the program exits.
 newForeignPtr finalizer p
   = do fObj <- newForeignPtr_ p
        addForeignPtrFinalizer finalizer fObj
@@ -152,24 +150,6 @@ newForeignPtrEnv finalizer env p
        return fObj
 #endif /* __HUGS__ */
 
-#ifdef __GLASGOW_HASKELL__
-type FinalizerEnvPtr env a = FunPtr (Ptr env -> Ptr a -> IO ())
-
--- | like 'addForeignPtrFinalizerEnv' but allows the finalizer to be
--- passed an additional environment parameter to be passed to the
--- finalizer.  The environment passed to the finalizer is fixed by the
--- second argument to 'addForeignPtrFinalizerEnv'
-addForeignPtrFinalizerEnv ::
-  FinalizerEnvPtr env a -> Ptr env -> ForeignPtr a -> IO ()
-addForeignPtrFinalizerEnv finalizer env fptr = 
-  addForeignPtrConcFinalizer fptr 
-       (mkFinalizerEnv finalizer env (unsafeForeignPtrToPtr fptr))
-
-foreign import ccall "dynamic" 
-  mkFinalizerEnv :: FinalizerEnvPtr env a -> Ptr env -> Ptr a -> IO ()
-#endif
-
-
 #ifndef __GLASGOW_HASKELL__
 mallocForeignPtr :: Storable a => IO (ForeignPtr a)
 mallocForeignPtr = do