From 5c591d200502e3fbd0cde6a53116e48fb306c377 Mon Sep 17 00:00:00 2001 From: simonmar Date: Wed, 24 Mar 2004 16:59:51 +0000 Subject: [PATCH] [project @ 2004-03-24 16:59:51 by simonmar] Add caveat about finalizers (don't refer to Handles from finalizers). --- GHC/ForeignPtr.hs | 6 ++++++ 1 file changed, 6 insertions(+) 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) -- 1.7.10.4