Skip to content

Instantly share code, notes, and snippets.

@pepeiborra
Last active May 26, 2020 19:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pepeiborra/06ea0c5e4b4982bb1b0e0a9263f12634 to your computer and use it in GitHub Desktop.
Save pepeiborra/06ea0c5e4b4982bb1b0e0a9263f12634 to your computer and use it in GitHub Desktop.
setValues state key file val = do
currentValue <- HMap.lookup (file, Key key) <$> readVar state
_ <- evaluate currentValue
let fin = Just (hPutStrLn stderr "AN OLD VALUE GOT RELEASED")
weak <- (evaluate >=> \v -> mkWeakPtr v fin) `traverse` currentValue
modifyVar_ state $ \vals -> do
-- Force to make sure the old HashMap is not retained
evaluate $ HMap.insert (file, Key key) (fmap toDyn val) vals
whenJust weak $ \w -> do
performGC
b <- deRefWeak w
if isNothing b then hPutStrLn stderr "GONE AFTER INSERT" else do
hPutStrLn stderr "DEREF VALUE STILL LIVES AFTER INSERT"
updatedMap <- readVar state
_ <- evaluate updatedMap
performGC
b <- deRefWeak w
if (isNothing b) then hPutStrLn stderr "GONE AFTER EVALUATING THE MAP" else do
hPutStrLn stderr "DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP"
_ <- evaluate $ HMap.lookup (file, Key key) updatedMap
performGC
b <- deRefWeak w
if isNothing b then hPutStrLn stderr "GONE AFTER LOOKUP" else do
hPutStrLn stderr "DEREF VALUE STILL LIVES AFTER LOOKUP"
_ <- evaluate $ length $ show updatedMap
performGC
b <- deRefWeak w
if (isJust b)
then hPutStrLn stderr "DEREF VALUE STILL LIVES AFTER FORCING THE MAP"
else hPutStrLn stderr "GONE AFTER FORCING THE MAP"
@pepeiborra
Copy link
Author

pepeiborra commented May 26, 2020

Example output:

DEREF VALUE STILL LIVES AFTER INSERT
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
GONE AFTER FORCING THE MAP
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
[DEBUG] Cancelled request IdInt 10
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
GONE AFTER FORCING THE MAP
GONE AFTER FORCING THE MAP
GONE AFTER FORCING THE MAP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
GONE AFTER FORCING THE MAP
GONE AFTER FORCING THE MAP
GONE AFTER FORCING THE MAP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
DEREF VALUE STILL LIVES AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
AN OLD VALUE GOT RELEASED
GONE AFTER FORCING THE MAP
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED
DEREF VALUE STILL LIVES AFTER INSERT
DEREF VALUE STILL LIVES AFTER EVALUATING THE MAP
DEREF VALUE STILL LIVES AFTER LOOKUP
GONE AFTER FORCING THE MAP
AN OLD VALUE GOT RELEASED

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment