1 {-# OPTIONS_GHC -XNoImplicitPrelude #-}
2 -----------------------------------------------------------------------------
4 -- Module : Foreign.Concurrent
5 -- Copyright : (c) The University of Glasgow 2003
6 -- License : BSD-style (see the file libraries/base/LICENSE)
8 -- Maintainer : ffi@haskell.org
9 -- Stability : provisional
10 -- Portability : non-portable (requires concurrency)
12 -- FFI datatypes and operations that use or require concurrency (GHC only).
14 -----------------------------------------------------------------------------
16 module Foreign.Concurrent
18 -- * Concurrency-based 'ForeignPtr' operations
20 -- | These functions generalize their namesakes in the portable
21 -- "Foreign.ForeignPtr" module by allowing arbitrary 'IO' actions
22 -- as finalizers. These finalizers necessarily run in a separate
23 -- thread, cf. /Destructors, Finalizers and Synchronization/,
24 -- by Hans Boehm, /POPL/, 2003.
27 addForeignPtrFinalizer,
30 #ifdef __GLASGOW_HASKELL__
31 import GHC.IOBase ( IO )
32 import GHC.Ptr ( Ptr )
33 import GHC.ForeignPtr ( ForeignPtr )
34 import qualified GHC.ForeignPtr
37 #ifdef __GLASGOW_HASKELL__
38 newForeignPtr :: Ptr a -> IO () -> IO (ForeignPtr a)
39 -- ^Turns a plain memory reference into a foreign object by associating
40 -- a finalizer - given by the monadic operation - with the reference.
41 -- The finalizer will be executed after the last reference to the
42 -- foreign object is dropped. Note that there is no guarantee on how
43 -- soon the finalizer is executed after the last reference was dropped;
44 -- this depends on the details of the Haskell storage manager. The only
45 -- guarantee is that the finalizer runs before the program terminates.
46 newForeignPtr = GHC.ForeignPtr.newConcForeignPtr
48 addForeignPtrFinalizer :: ForeignPtr a -> IO () -> IO ()
49 -- ^This function adds a finalizer to the given 'ForeignPtr'.
50 -- The finalizer will run after the last reference to the foreign object
51 -- is dropped, but /before/ all previously registered finalizers for the
53 addForeignPtrFinalizer = GHC.ForeignPtr.addForeignPtrConcFinalizer