Attached is a program with a space leak that I do not understand. I have
coded a simple 'map' function, once using unsafePerformIO and once
without. UnsafePerformIO has a space leak in some circumstances. In the
main program I demonstrate cases with and without space leak. Without
space leak the program writes a file to the disk until it is full. Any idea?
The original problem is a function that is compiled by LLVM and shall be
applied to a list in a mapAccumL manner.
{-
$ ghc --make -Wall -O -prof -auto-all InterleaveIO.hs
$ InterleaveIO +RTS -M1m -prof-all -RTS
-}
import System.IO.Unsafe (unsafePerformIO, unsafeInterleaveIO, )
makeSuccUnsafe1 :: IO ([Char] -> [Char])
makeSuccUnsafe1 =
return $
\ sig -> unsafePerformIO $ do
let go xt =
unsafeInterleaveIO $
case xt of
[] -> return []
x:xs -> fmap (succ x :) $ go xs
go sig
makeSuccUnsafe :: IO ([Char] -> [Char])
makeSuccUnsafe =
return $
\ sig ->
let go xt =
unsafePerformIO $
case xt of
[] -> return []
x:xs -> return (succ x : go xs)
in go sig
makeSuccPlain :: IO ([Char] -> [Char])
makeSuccPlain =
return $
\ sig ->
let go xt =
case xt of
[] -> []
x:xs -> succ x : go xs
in go sig
splitAtLazy :: [b] -> [a] -> ([a],[a])
splitAtLazy nt xt =
(\ ~(ys,zs) -> (ys,zs)) $
case (nt,xt) of
(_:ns, x:xs) ->
let (ys,zs) = splitAtLazy ns xs
in (x:ys,zs)
(_, xs) -> ([],xs)
makeTwoLists :: Char -> ([Char], [Char])
makeTwoLists c =
splitAtLazy (repeat ()) $ repeat c
main :: IO ()
main = do
succUnsafe <- makeSuccUnsafe
succPlain <- makeSuccPlain
writeFile "test.txt" $
let (prefix, suffix) = makeTwoLists 'a'
in case 3::Int of
-- no leak
0 -> succUnsafe $ prefix ++ suffix
-- no leak
1 -> succPlain $ prefix ++ suffix
-- no leak
2 -> succPlain prefix ++ succPlain suffix
-- leak
3 -> succUnsafe prefix ++ succPlain suffix
-- no leak
4 -> succPlain prefix ++ succUnsafe suffix
-- leak
5 -> succUnsafe prefix ++ succUnsafe suffix
_ -> error "not implemented"
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe