From: simonmar Date: Wed, 24 Mar 2004 16:59:51 +0000 (+0000) Subject: [project @ 2004-03-24 16:59:51 by simonmar] X-Git-Tag: nhc98-1-18-release~338 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=5c591d200502e3fbd0cde6a53116e48fb306c377;p=ghc-base.git [project @ 2004-03-24 16:59:51 by simonmar] Add caveat about finalizers (don't refer to Handles from finalizers). --- diff --git a/GHC/ForeignPtr.hs b/GHC/ForeignPtr.hs index 43f9ac7..41bcfab 100644 --- a/GHC/ForeignPtr.hs +++ b/GHC/ForeignPtr.hs @@ -145,6 +145,12 @@ addForeignPtrConcFinalizer :: ForeignPtr a -> IO () -> IO () -- 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@). +-- addForeignPtrConcFinalizer f@(ForeignPtr fo r) finalizer = do fs <- readIORef r writeIORef r (finalizer : fs)