MicroHs-0.15.0.0: tests/Weak.hs
module Weak where
import System.Mem.Weak
import System.Mem
import Data.IORef
import Control.Concurrent
main :: IO ()
main = do
let key = "key" :: String
let val = "val" :: String
let final = putStrLn "run final"
putStrLn $ "before first gc " ++ show (key, val)
--putStr $ "test finalizer: "; final
wk <- mkWeak key val (Just final)
putStrLn "mkWeak done"
performGC -- key is alive below, so the wek pointer should survive
mval <- deRefWeak wk
putStrLn $ "after first gc " ++ show (key, mval)
performGC -- the key is not alive, so the weak pointer should be die
mval' <- deRefWeak wk
putStrLn $ "after second gc " ++ show mval'
yield -- give finalizer a chance to run
putStrLn "after yield"
let key2 = "key2" :: String
let final2 = putStrLn "run final2"
wk2 <- mkWeak key2 val (Just final2)
putStrLn "about to finalize"
finalize wk2
finalize wk2
performGC