X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Foreign%2FForeignPtr.hs;h=af39a61aac5db10c0d45237270d99caf9d56d0d4;hb=d539a9457e2c79a9f13744d073d3f253ea2fb33e;hp=94c1591494df0c33d8df6ff201146472f7c38a5e;hpb=d2e40014e751abc0915a84401ec2dccfcc1951b4;p=ghc-base.git diff --git a/Foreign/ForeignPtr.hs b/Foreign/ForeignPtr.hs index 94c1591..af39a61 100644 --- a/Foreign/ForeignPtr.hs +++ b/Foreign/ForeignPtr.hs @@ -42,6 +42,7 @@ import NHC.FFI ( ForeignPtr , FinalizerPtr , newForeignPtr + , newForeignPtr_ , addForeignPtrFinalizer , withForeignPtr , unsafeForeignPtrToPtr @@ -70,9 +71,9 @@ import GHC.ForeignPtr #if !defined(__NHC__) && !defined(__GLASGOW_HASKELL__) import Foreign.Marshal.Alloc ( malloc, mallocBytes, finalizerFree ) -import Data.Dynamic +import Data.Typeable -#include "Dynamic.h" +#include "Typeable.h" INSTANCE_TYPEABLE1(ForeignPtr,foreignPtrTc,"ForeignPtr") instance Eq (ForeignPtr a) where @@ -87,6 +88,19 @@ instance Show (ForeignPtr a) where #ifndef __NHC__ +newForeignPtr :: Ptr a -> FinalizerPtr 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. The only guarantee is that the finaliser runs before the program +-- terminates. +newForeignPtr p finalizer + = do fObj <- newForeignPtr_ p + addForeignPtrFinalizer fObj finalizer + return fObj + withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b -- ^This is a way to look at the pointer living inside a -- foreign object. This function takes a function which is @@ -113,11 +127,6 @@ withForeignPtr fo io return r #endif /* ! __NHC__ */ -#ifdef __HUGS__ --- temporary aliasing until hugs catches up -unsafeForeignPtrToPtr = foreignPtrToPtr -#endif - #ifndef __GLASGOW_HASKELL__ mallocForeignPtr :: Storable a => IO (ForeignPtr a) mallocForeignPtr = do