[commit: ghc] master: Improved documentation for Foreign.Concurrent (#12547) (3a17916)

git at git.haskell.org git at git.haskell.org
Fri Sep 23 04:40:09 UTC 2016


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/3a17916bb5fd4bda9d21359a82f5b5f38cc0fdad/ghc

>---------------------------------------------------------------

commit 3a17916bb5fd4bda9d21359a82f5b5f38cc0fdad
Author: Simon Marlow <marlowsd at gmail.com>
Date:   Fri Sep 16 14:48:57 2016 +0100

    Improved documentation for Foreign.Concurrent (#12547)
    
    We had better docs for the underlying functions in GHC.ForeignPtr, but
    this wasn't propagated to the re-exported versions in
    Foreign.Concurrent.


>---------------------------------------------------------------

3a17916bb5fd4bda9d21359a82f5b5f38cc0fdad
 libraries/base/Foreign/Concurrent.hs | 37 ++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/libraries/base/Foreign/Concurrent.hs b/libraries/base/Foreign/Concurrent.hs
index 9d27166..a19b20b 100644
--- a/libraries/base/Foreign/Concurrent.hs
+++ b/libraries/base/Foreign/Concurrent.hs
@@ -35,17 +35,38 @@ import GHC.ForeignPtr ( ForeignPtr )
 import qualified GHC.ForeignPtr
 
 newForeignPtr :: Ptr a -> IO () -> IO (ForeignPtr a)
--- ^Turns a plain memory reference into a foreign object by associating
--- a finalizer - given by the monadic operation - with the reference.
--- The finalizer will be executed after the last reference to the
--- foreign object is dropped.  There is no guarantee of promptness, and
+--
+-- ^Turns a plain memory reference into a foreign object by
+-- associating a finalizer - given by the monadic operation - with the
+-- reference.  The storage manager will start the finalizer, in a
+-- separate thread, some time after the last reference to the
+-- @ForeignPtr@ is dropped.  There is no guarantee of promptness, and
 -- in fact there is no guarantee that the finalizer will eventually
 -- run at all.
+--
+-- Note that references from a finalizer do not necessarily prevent
+-- another object from being finalized.  If A's finalizer refers to B
+-- (perhaps using 'touchForeignPtr', then the only guarantee is that
+-- B's finalizer will never be started before A's.  If both A and B
+-- are unreachable, then both finalizers will start together.  See
+-- 'touchForeignPtr' for more on finalizer ordering.
+--
 newForeignPtr = GHC.ForeignPtr.newConcForeignPtr
 
 addForeignPtrFinalizer :: ForeignPtr a -> IO () -> IO ()
--- ^This function adds a finalizer to the given 'ForeignPtr'.
--- The finalizer will run after the last reference to the foreign object
--- is dropped, but /before/ all previously registered finalizers for the
--- same object.
+-- ^This function adds a finalizer to the given @ForeignPtr at .  The
+-- finalizer will run /before/ all other finalizers for the same
+-- object which have already been registered.
+--
+-- This is a variant of @Foreign.ForeignPtr.addForeignPtrFinalizer@,
+-- where the finalizer is an arbitrary @IO@ action.  When it is
+-- invoked, the finalizer will run in a new thread.
+--
+-- NB. Be very careful with these finalizers.  One common trap is that
+-- if a finalizer references another finalized value, it does not
+-- prevent that value from being finalized.  In particular, 'Handle's
+-- are finalized objects, so a finalizer should not refer to a 'Handle'
+-- (including @stdout@, @stdin@ or @stderr@).
+--
 addForeignPtrFinalizer = GHC.ForeignPtr.addForeignPtrConcFinalizer
+



More information about the ghc-commits mailing list