[project @ 2004-03-24 16:59:51 by simonmar]
authorsimonmar <unknown>
Wed, 24 Mar 2004 16:59:51 +0000 (16:59 +0000)
committersimonmar <unknown>
Wed, 24 Mar 2004 16:59:51 +0000 (16:59 +0000)
Add caveat about finalizers (don't refer to Handles from finalizers).

GHC/ForeignPtr.hs

index 43f9ac7..41bcfab 100644 (file)
@@ -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)