a914d9532f3d709eb0a8758cb056edac633f8160
[ghc-base.git] / Foreign / Concurrent.hs
1 {-# OPTIONS_GHC -XNoImplicitPrelude #-}
2 -----------------------------------------------------------------------------
3 -- |
4 -- Module      :  Foreign.Concurrent
5 -- Copyright   :  (c) The University of Glasgow 2003
6 -- License     :  BSD-style (see the file libraries/base/LICENSE)
7 -- 
8 -- Maintainer  :  ffi@haskell.org
9 -- Stability   :  provisional
10 -- Portability :  non-portable (requires concurrency)
11 --
12 -- FFI datatypes and operations that use or require concurrency (GHC only).
13 --
14 -----------------------------------------------------------------------------
15
16 module Foreign.Concurrent
17   (
18         -- * Concurrency-based 'ForeignPtr' operations
19
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.
25
26         newForeignPtr,
27         addForeignPtrFinalizer,
28   ) where
29
30 #ifdef __GLASGOW_HASKELL__
31 import GHC.IO           ( IO )
32 import GHC.Ptr          ( Ptr )
33 import GHC.ForeignPtr   ( ForeignPtr )
34 import qualified GHC.ForeignPtr
35 #endif
36
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.  There is no guarantee of promptness, and
43 -- in fact there is no guarantee that the finalizer will eventually
44 -- run at all.
45 newForeignPtr = GHC.ForeignPtr.newConcForeignPtr
46
47 addForeignPtrFinalizer :: ForeignPtr a -> IO () -> IO ()
48 -- ^This function adds a finalizer to the given 'ForeignPtr'.
49 -- The finalizer will run after the last reference to the foreign object
50 -- is dropped, but /before/ all previously registered finalizers for the
51 -- same object.
52 addForeignPtrFinalizer = GHC.ForeignPtr.addForeignPtrConcFinalizer
53 #endif